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 があったりするわけですね。