perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4
まず
公開前に、他のスニペットストックを見返して、あまりにも不親切なので、本当に、ざっとした解説を書こうかと思った。
ここを読めって内容ですけど。
-e 'CODE'
$ perl -e 'CODE'
コードを実行
-le 'CODE'
$ perl -le 'CODE'
後述 -n
, -p
と組合さった時には自動的に chomp $_
を実行
print
出力時改行を自動的に付随
printf
には改行が付かない
-ne 'CODE'
-n
は以下のコードと同義
LINE: while (defined($_ = <ARGV>)) {
CODE;
}
文字通り「同義」なので、LINE
ラベルも遠慮無く使おう
$ perl -lne 'print and last LINE ' SOMETING.txt
-pe 'CODE'
-p
は以下のコードと同義
LINE: while (defined($_ = <ARGV>)) {
CODE;
}
continue {
die "-p destination: $!\n" unless print $_;
}
-ne 'CODE A }{ CODE B'
CODE に CODE A }{ CODE B
と埋め込めば、
LINE: while (defined($_ = <ARGV>)) {
CODE A;
}
{
CODE B;
}
と、ブロック区切りが挿入されて while ループと裸のブロックが一つ出来る。普通にブロックなので、ラベルも付ける事が出来るし、
例えば、continue ブロックにしたければ、
$ perl -ne 'CODE A} continue { CODE B'
と書けば良い。
$ perl -ne 'CODE A} for( @ARR ){ CODE B'
や、
$ perl -ne 'CODE A} print "job end" ; {'
なども当然可能。
-pe 'CODE A }{ CODE B' は?
$ perl -lpe '} L:{ $_ = q{foobar}' SOMETHING.txt
-p
のコンティニューブロックが裸のブロック(上ではL:{ $_ = q{foobar} }
)に付く。
-p
はコンティニューブロック中に print $_
する。従って、当然の帰結として、上記 L ブロック中で、 $_
が未定義であれば、エラー表示される(use warnings
指定時)。
トリッキーが重なるだけで、あまりにもメリットがない。
複数行に渡るワンライナー
矛盾してますが。
最初に全てのオプションを記載した後は、 '
で締めて、改めて -e
を指定してやる事により、任意のタイミングで区切る事が可能。流石に、関数名の途中とかでは無理ですが。
$ perl -le 'for' -e '( 1,2,3,4)' -e '{ warn $_ }'
1 at -e line 3.
2 at -e line 3.
3 at -e line 3.
4 at -e line 3.
これを利用するとエラーした時の、ドコダヨソレ!が軽減。
$ perl -le 'for( 1,2,3,4){ warn $_ }'
1 at -e line 1.
2 at -e line 1.
3 at -e line 1.
4 at -e line 1.
ついでに \⏎
を利用すれば、
$ perl -le 'for' \
> -e '( 1,2,3,4)' \
> -e '{ warn $_ }'
見栄え良くワンライナーを書く事が出来る。
もひとつついでに
ああ、何か違和感があったんだ。
最初に全てオプションを書く必要は無い
オプション書き忘れた!って時には
$ perl -le 'for( 1,2,3,4){ warn $_ }' -pe 1 -MO=Deparse
次回へ。