LoginSignup
10
11

More than 5 years have passed since last update.

perl のワンライナーの初歩 #1

Last updated at Posted at 2015-01-09

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      

次回へ。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11