詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

パール、アナルを使え!または私は如何にして Perl のワンライナーを書けるようになったか

簡単に言うとこういうことです。今日はこれだけ覚えて帰ってください。

perl -anal -e "…"

同様のオプションは Ruby でも使えます。

解説

-a

いきなり見かけないオプションですが、入力を空白文字で区切り、@F という配列に入れてくれます。それ以外の影響はないので使わないときでも指定して問題なし。2 回指定してるのも意味ないです。語呂合わせです。Ruby の場合は $F ですね。

-n

-e で指定されたコードを

LINE:
while (<>) {
    …
}

で囲みます。標準入力やファイルを一行ずつ処理するときに便利。sedgrep が簡単に書けますね。ワンライナーでは多様するオプションでしょう。代わりに -p を指定することで最後に print; することもできます。

-l

-n-p が指定されているときに各入力を chomp します。また、各出力に改行を追加します。

というのが表面的な説明で、実際には $/$\ などの特殊な変数の値が書き変わっています。-0 と組み合わせると場合によっては便利です。

% perl -ln0 -e "…"

などとすると入力を "\0" で区切り、各出力の末尾に改行文字が追加されるようになります。

ちなみに

この辺の話は perldoc perlrun で読めます。

B::Deparse を使うと何が起こっているのか分かりやすいですね。

% perl -MO=Deparse -anal -e 'poyo()'
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our(@F) = split(' ', $_, 0);
    poyo();
}

おわりです

ひとりでできるもん ~オトコのコのためのアナニー入門~

ひとりでできるもん ~オトコのコのためのアナニー入門~

はてなで一緒に働きませんか?