「暗号記述言語」perlはBNFで記述できないほど多様な文法を持つ言語であるため、同じ処理を非常にたくさんのやり方で記述できます。つまり、同じことをするのに非常に長々とコードを書く方法もあれば、短くすませてしまえる方法もあるということ。そんなわけで、あまり知られていない(?)けど知っとくと得するかも、と思った文法をメモっておきます。
オプション
- -e … 言うに及ばず。オプション後に指定されたスクリプトを実行する。1linerを書くときに必須ですね。
- -n … スクリプトの前後に while(<>) { 〜〜; } を追加してくれる。入力ファイルを行ごとに処理するときに便利。
- -p … -nに加え、ループの最後に print; を追加してくれる。入力ファイルを行ごとに処理して表示するときに便利。
- -a … -nや-pと共に使ったときに、各入力行を自動的にsplitして@Fという変数に入れてくれる。スペースとかタブで区切られたデータ処理に便利。冒頭の空白は無視してくれたり、結構賢い。
- -l [octal] … 行の区切りを示す特殊変数 $\ を変更する。引数を省略すると$\="\n"に。"\n"だと、-nに加え、ループの頭で入力データをchompしてくれ、各 print 後に改行コードを出力してくれる。
- -0 [octal] … 入力の単位(レコード)の区切り文字を指定する。引数を省略すると区切りなしに、ファイルを一括読み込みする。
- -i … 実行結果で入力ファイルの内容を置換する。バックアップファイルの作成も可能。データファイルの一括変換等に便利。
くわしい仕様はperl -hやドキュメントを見てもらうとして、簡単な例を挙げておきます。
% perl -lane 'print $F[2];' test.txt % perl -i .bak -lpe 's/abc/ABC/g;' test.txt
一個目のは、test.txtを読み込み、各行の3番目のデータだけを出力します。-l の作用で自動改行されます。
二個目のは、test.txtを読み込み、abcをABCに置き換え、その結果でファイルを上書きします。元のファイルはtest.txt.bakとして残ります。複数ファイルをまとめて置換することもでき、便利です。
上記はごく簡単な例ですが、もっと複雑なことを楽にやるには便利です。ちなみにスクリプト冒頭に
#!perl -l
等と書いておくと、「%perl スクリプトファイル」とした場合にもちゃんと実行時にオプション指定をエミュレーションして、認識してくれます。
特殊変数
- @F … 上記 -a オプションで使用。
- $\ … 行(レコード)の出力時の区切り文字。上記 -l オプション参照。
- $/ … 入力の単位(レコード)の区切り文字。デフォルトは"\n"で、<〜>で一行ずつ読み込む。undefするとファイル全体が一気に読み込まれるように。\32など数値リファレンスを指定すると32文字ずつ読み込ませることもできる。
- $, … print @a; 等としたときの要素間の区切り。デフォルトは""。ちなみにprint "~","~"としたときの「,」部分でも出力される。リストなので。
- $" … print "@a"; 等としたときの要素間の区切り。デフォルトは" "。
- @+, @- : 正規表現で()にマッチしたオフセットが配列で入る。
その他、正規表現がらみ等、いろいろありすぎで書ききれませんので、http://kabocha.org/jelfe/08/06.html とかを参照のこと。
正規表現
- \b:単語の区切り
- \A, \Eなど:^, $の文字クラス版。[〜]内に書ける。
- \G : 前回マッチした文字列の最後の位置を表す0文字幅の文字クラス。
- 拡張正規表現
- (?〜)シリーズ。http://tech-web.net/perlmania/perlre2.html あたり。正規表現パズルなどを参照。
- (?{〜})でスクリプトの実行まで出来る。Hello,world!の難読化以外に何に使うんだろうか。experimentalということで、正規表現の中で正規表現を実行すると落ちるかもしれないらしい。
演算子
- フリップフロップ演算子 … 正規表現などと組み合わせて範囲マッチング。http://blog.livedoor.jp/dankogai/archives/50720796.html 等を参照。
#!perl -ln print if /BEGIN/ .. /END/
のように使う。
より深い話は http://www.nmt.ne.jp/~ysas/diary/?0116 に。(状態を持つ珍しい演算子。rubyにもある。A..Bを繰り返し評価すると、Aが偽の間は0, Aの評価値が真になった後はBを評価し始め、Bが真になるまでは評価回数をカウントして返す演算子。Bが偽になると0を返す)。
- => 演算子 … カンマと一緒。見た目重視用^^; 。ただし左側は「裸の文字列」と見なされる。http://d.akinori.org/?date=20070530
- do "ファイル名" … 指定したファイルを読み込んで実行する。ファイル名じゃなくてブロックを渡すこともできる。
wantarray
print locatime #=> 0 24 6 18 8 107 2 260 0; scalar locatime #=> "Mon Sep 17 20:23:10 2007"
とか、
print reverse "ABC" #=> "ABC"; print scalar reverse "ABC"; #=> "CBA" のように、
コンテクストによって動作を変える関数を作るために使う。
AUTOLOAD
http://blog.livedoor.jp/dankogai/archives/50491359.html あたりを参照。
いろいろありすぎでだんだん疲れていい加減になってきました。(-_-;
でも頭の片隅に置いとくといつか役立ちそう。
Effective Perlとかも読まなきゃ。
Effective Perl (ASCII Addison Wesley Programming Series)
- 作者: ジョセフ・N.ホール,ランドル・L.シュワォーツ,Joseph N. Hall,Randal L. Schwartz,吉川邦夫
- 出版社/メーカー: アスキー
- 発売日: 1999/03
- メディア: 単行本
- 購入: 5人 クリック: 56回
- この商品を含むブログ (52件) を見る