― Web Technology and Life ―

Perlワンライナーのオプションの位置が重要

2013-10-03
今までPerlのワンライナーがほとんど書けなかったがmotemenさんの記事を見て、その原因が分かったので、メモ。

motemenさんありがとうございます!

まずはじめにmotemenさんのパール、アナルを使え!または私は如何にして Perl のワンライナーを書けるようになったかという記事が大変参考になりました。お礼申し上げます。

結論的には、motemenさんの記事の冒頭にあるように以下のオプションを覚えればいいのです。

perl -anal -e "…"

ただ、一つ加えるならこのオプションの順番が重要だということです。

motemenさんの記事の最後にB::Deparseを使ったデバックが載っていてこれが大変すっきりとします。以下に並び替えたものを載せます。

perl -MO=Deparse -anal -e 'poyo()' ~正解~

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = )) {
    chomp $_;
    our(@F) = split(' ', $_, 0);
    poyo();
}

perl -MO=Deparse -anle 'poyo()' ~正解~

最初のと同じです。

BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = )) {
    chomp $_;
    our(@F) = split(' ', $_, 0);
    poyo();
}
-e syntax OK

perl -MO=Deparse -anel 'poyo()' ~はずれ~

BEGINからはじめるlオプションの存在が無効化されていることがわかりますし、なんかpoyo()が文字化けみたいになっていますね。

LINE: while (defined($_ = )) {
    our(@F) = split(' ', $_, 0);
    '???';
}
-e syntax OK

perl -MO=Deparse -aenl 'poyo()' ~はずれ~

nオプションのループも表示されませんし、相変わらず文字化けです。

'???';
-e syntax OK

perl -MO=Deparse -eanl 'poyo()' ~はずれ~

上と同様の状態です。

'???';
-e syntax OK

結論

ワンライナーのeオプションは最後につけるべし

  • eオプションの後のオプションは無効化
  • eオプションの後にオプションがあるとコードが解読できない

どうしてこのような挙動になるのかは、モヒカンな方々にPerl上級者入学式を是非やって頂きたいところですね。ぼくはずっとeオプション最初につけていたのでまともなperlワンライナー書けなかったのですが、今日からモリモリワンライナー書きたいと思います!!

それにしてもワンライナーでB::Deparseって便利だなー。

【追記】-eの後にオプションつけちゃいけないのは-eが引数をとるから

Perl でワンライナー書くときの -e の位置ということで、bayashiさんに教えて頂きました!ありがとうございますっ!!ブログに書くといいことありますねっ!

Perl update_at : 2013-10-10T21:24:48
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus