2013/10/05

Perl でワンライナー書くときの -e の位置

Perl ワンライナーで eオプションの後にオプションがあるとコードが解読できない のはなぜかという話にワンライナー芸人として反応してみる。ちなみに結論を先に書くと、Perl の話ではないですねこれ。

例えば、

$ perl -MO=Deparse -el 'print 1;'
'???';
-e syntax OK

上のように -el 'print 1;' だと動かなくて、

$ perl -MO=Deparse -le 'print 1;'
BEGIN { $/ = "\n"; $\ = "\n"; }
print 1;
-e syntax OK

-le 'print 1;' という風に le の順だと動くと。

もちろん、以下は動く。

$ perl -MO=Deparse -l -e 'print 1;'
BEGIN { $/ = "\n"; $\ = "\n"; }
print 1;
-e syntax OK

こたえ

-e は引数を取るからです。-e 'print 1;'-e='print 1;' ということで、例えば以下は動きますね。

$ perl -MO=Deparse -e 'print 1;' -l
BEGIN { $/ = "\n"; $\ = "\n"; }
print 1;
-e syntax OK

最初に書きましたが、これは Perl の話というより、コマンドラインのパーサーの話です。

コマンドラインパーザの流れは英語版 wikipedia の Getopt にある history がよくまとまってる気がします。もしくは POSIX の方の Getopts ページ。GNU 拡張の getopt_long あたりから、perl のコマンドラインオプションを解釈する定番の Getopt::Long があったりするわけですね。

サイト内検索