perl -p

はいお役立ちの Perl 講座のコ〜ナ〜です。突然ですが perl -p オプションは便利ですよー。例えば前、 ABA さんのコードに使われている OpenGLAPI のリストを作ろうと思ったんです。

egrep 'gl(u|[A-Z])' src/**/*.d | perl -pe 's/.*?:\s+//; s/\(.*//; s/.*?(gl.*)/\1/' | sort | uniq

うわー便利だねー。 zsh の **/*.d で全ソースを適当に grep した後に -pe でフィルタかけてるってわけさー。要するに sed みたいな。

あと -i と組み合わせると便利なのだよー。こないだ separation って書いてた部分はヘンだから distribution を使えって言われたので

perl -i -p -e 's/separation/distribution/g' *.tex

とかしたんですよー。これで -p の結果をそのまま読み込み元のファイルに保存してくれるって寸法なのさー。要するに sed みたいな。

ってこんなのはどうでも良くてですね。

以下のようなコードが #codegolf で話題になってて面白かったのでした。

問題: 出力はなんでしょう?

(echo abc ; echo cde ; echo efg) | perl -pe '$\=$_.$\}{'

答え: 逆順になります。

efg
cde
abc

要は、 }{ って何!?っていう話なのですが、これ、つまりなんていうか -p オプションは「入力を受け取って各行ごとにワンライナーを実行しては出力する」っていう話ではなく、要は while (<>) { HOGEHOGE; print; } の HOGEHOGE の部分にワンライナーつっこんで実行させる、っていう話だったのですね、という。つまり -p の while は閉じても問題無いのです。つまりさっきのコードは以下みたいに解釈されてるってことでしょう。

(echo abc ; echo cde ; echo efg) | perl -e 'while(<>){$\=$_.$\}{print;}' 

いやー perl -p ってすごい便利ですねー

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h