Perlスクリプトメモ

Posted on Tue 07 January 2014 in blog

参考文献

  1. Perl基礎文法最速マスター
  2. ミニマル perl

スクリプトを書く時

  • プラグマ
  • 推奨 : スクリプト先頭に書く
use strict;
use warnings;
  • 1文字でも減らしたい

    • print のデフォルト引数は、 $_
    • print $_; したいだけなら書く必要ない。

用語

レコード

  • 1つのまとまりとして読み書きされる文字の集合
  • 入出力の際、ファイルはレコードの集まりと見ることができる。 この時、デフォルトでは、1行がレコード。

入力レコードセパレータ

  • 入力レコードの終端区切りを表す文字、または文字シーケンス(文字の並び)。
  • Linuxとかでは、デフォルトではラインフィード。
  • Perl ではOS固有の入力レコードセパレータを n として、参照できる。

ニューライン

  • n のこと。
  • OS固有の入力レコードセパレータ。

スイッチ引数

  • -s オプション
  • 良い感じのコマンドラインオプションを取ることができる。
  • 引数の与え方で2つの方法がある。
-foo='test' #=> $foo == 'test'
-foo        #=> $foo == true : -debugで、デバッグ用、みたい使う。
  • スイッチ引数を任意にしているスクリプトでは、冒頭にour関数を使うのが良い。
our($foo);
our($foo, $bar, ...);

真偽値

偽になるのは、次の3パターンある。

  1. 数値
    • 0 と同等な値
  2. 文字列
    • null文字列
    • 0 を保持する文字列 ( '0' みたいな)
  3. 変数 : 値を持たない変数
    • まだ設定されていない変数とか。定義されているかは、 defined を使うとわかる。

特別な文字列

$/, $\

  • 入力,出力レコードセパレータを指定する

$.

  • 今読んでいる入力レコードが何番目か、を表す

  • 通常は行数

  • コマンドラインオプションや$/で、入力レコードセパレータを指定したときは、行数じゃなくなる

  • 複数のファイルを読んでいる場合、ファイルをまたいで番号付けらられる

  • 以下のようにすることで、ファイルごとに $. の値をリセットできる

    # 各ファイル終了時にレコードカウンタの $. をリセット
    eof and close ARGV
    

$_

  • 最後に読み込んだ入力レコード。

$"

  • ダブルクォートで囲んだ配列の各要素の間に挿入される文字
  • デフォルトはスペース

$,

  • print 文の2種類の特殊なフォーマット処理に利用

    • print の引数を区切るコンマの代わりに出力で使用される
    • クォートされていない配列やハッシュの要素の区切り
  • デフォルトは空文字

$&

  • マッチした文字列の表示

$`

  • マッチしたレコード中で最後のマッチの開始部分の前の部分、を保持

$'

  • マッチしたレコード中で最後のマッチの末尾の後の部分、を保持

ARGV

  • 現在の入力ソースのファイルハンドル。
  • 特にクローズのために使われる。

$ARGV

  • n, p オプションや空の入力演算子を使用すると、ファイル名が格納される。
  • STDIN の時は、 - が表示される。

@ARGV

  • n, p や入力演算子を使わないときに、自前でプログラムの引数にアクセスするために使う。

<>

\n

  • OS 固有のレコードセパレータ

変数

$var : 変数

  • 宣言と代入
my $var = 'aaa'
  • '' と ""
    • シングルクォートとダブルクォートの違いは、変数が展開されるかどうか。
  • join (.), split, length, substr, index

@array : 配列

  • 宣言と代入
my @array
@array = (1,2,3)
  • $array[0] などとして、各値を得る
  • $array[-2] というようにすれば、最後から2番目の意味
  • pop, push, shift, unshift も使える
  • 配列の大きさを得るのは、
$array_size = @array

などとする

%hash : ハッシュ

  • 宣言と代入
my %hash; %hash = (a => 1, b => 2);
  • $hash{a} などとして、各値を得る
  • keys, values, exists, delete

制御構文

if { ~ }

if { ~ } else { ~ }

if { ~ } elsif { ~ }

while ( 条件 ) { ~ }

for ( my $i =0 ; $i < 5 ; $i++ ) { ~ }

foreach my $field (@fields) { ~ }

  • 配列の各要素に対して何かを行う
  • foreach は for のエイリアスらしい。

比較演算子

文字列比較

  • $s eq $t
  • $s ne $t
  • $s lt $t
  • $s gt $t
  • $s le $t
  • $s ge $t

サブルーチン : 関数

他の言語との違いは、

  • 引数を関数宣言に書かない
  • @_ を使って引数にアクセス
sub sub {
  my ($num1, $num2) = @_;
  my $result = $num1 - $num2;
  return $result;
}

BEGIN, END

入力の処理の前や後に、処理を行う。
BEGIN は、Usage の表示に使ったりする。
END は、全体の結果・統計の計算・表示に使ったりする。
BEGIN { statements; }

END { statements; }

文字列修飾子

以下の2箇所で使える。

  • ダブルクォート中の文字列
  • 置換後文字列フィールド
文字列修飾子
修飾子 効果
\U 右側の文字列を、\E または文字列の末尾まで、大文字に変換
\u 右側の文字を大文字に変換
\L 右側の文字列を、\E または文字列の末尾まで、小文字に変換
\l 右側の文字を小文字に変換
\E 変換を終了

論理演算

and, or

and の方が or より優先度が高い。

$one or $two and $three
# => $one or ( $two and $three )

!

論理否定。

関係演算子

関係演算子
数値 文字列 意味
== eq 等しい
!= ne 等しくない
> gt より大きい
>= ge 以上
< lt より小さい
<= le 以下
<=> cmp
比較
-1 : 左辺が小さい
0 : 等しい
1 : 左辺が大きい

以下は、組み込み関数

IOに関連する関数

print

STDOUT に出力する

printf

  • print のニューラインなしバージョン : -l の影響を受けない
  • 他にもたくさん使い勝手が良い

warn

STDERR にメッセージを送る。

# 出力メッセージのあと、更にエラー行が付加される。
warn "msg\n"
# \n を入れると簡潔なエラーメッセージ : エラー行などを表示しない。
warn "msg\n"
print STRERR "a", "b"

die

STDERR にメッセージを送って、プロセスを終了する。
出力メッセージの形式は warn と同様。
デフォルトのエラーコードは255。
# BEGIN ブロックの外で
die "$0 : msg\n"
# BEGIN ブロックの中で
$success or warn "msg\n" and exit 255;

close

ファイルハンドルを引数に取って、ファイルを閉じる。
close ARGV

eof

現在のファイルを最後まで読み込んだら、真を返す。
# 各ファイル終了時にレコードカウンタの $. をリセット
eof and close ARGV

dbmopen, dbmclose

flock

format

文字列操作

chomp

chop

chr

crypt

hex

index

lc, lcfirst, uc, ucfirst

  • それぞれ \L, \l, \U, \u

length

  • 文字列の長さ

substr

  • 文字列の切り出し
  • 添字は 0 から始まる
# 文字列先頭から、4文字目まで
substr $_, 0, 3;

その他

defined

undef

dump

eval

formline

time, gmtime, localtime

local

pos

scalar

reset

system