知っておくと良いことがあるかもしれないperlの仕様

「暗号記述言語」perlBNFで記述できないほど多様な文法を持つ言語であるため、同じ処理を非常にたくさんのやり方で記述できます。つまり、同じことをするのに非常に長々とコードを書く方法もあれば、短くすませてしまえる方法もあるということ。そんなわけで、あまり知られていない(?)けど知っとくと得するかも、と思った文法をメモっておきます。

オプション

  • -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 とかを参照のこと。

正規表現

演算子

#!perl -ln
print if /BEGIN/ .. /END/

のように使う。
より深い話は http://www.nmt.ne.jp/~ysas/diary/?0116 に。(状態を持つ珍しい演算子rubyにもある。A..Bを繰り返し評価すると、Aが偽の間は0, Aの評価値が真になった後はBを評価し始め、Bが真になるまでは評価回数をカウントして返す演算子。Bが偽になると0を返す)。

  • 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)

Effective Perl (ASCII Addison Wesley Programming Series)