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