次のコマンドは期待どおりに機能します。
perl -lne 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt
これも動作します:
perl -nle 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt
ただし、次のエラーが表示されます。
perl -nel 'print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/' CMakeLists.txt
エラーメッセージは次のとおりです。
/install(TARGETS (.*) RUNTIME DESTINATION bin)/: そのファイルやディレクトリがない場合、$1 印刷を開くことができません。
その理由は何ですか?
ベストアンサー1
この-e
オプションは、Perlコードで評価される文字列である1つの引数を使用します。オプションの順序は重要ではないため(この場合)をperl -lne '...'
使用すると、期待どおりに機能します。perl -nle '...'
しかし、を使用するとき、perl -nel '...'
「文字列をl
Perlコードとして評価し、それをコードが読み取る'...'
ファイルの名前として使用してください」と言うのはあまり意味がありません(したがって、「ファイルが存在しないか」という奇妙なメッセージが表示されます)。ディレクトリ"エラー)。
したがって、いいえ、オプションの順序は重要ではありません(ここでは)。ただし、オプションを移動する場合は、-e
オプション引数とPerlコードを移動する必要があります。Perlコードが常にオプションの直後にあるようにする必要があります。
-e
たとえば、そのオプションを最初に配置するには、次のようにします。
perl -e '...' -ln
同じコマンドラインでなどのオプションを混在させる場合、オプションの順序はperl
非常に重要です。 1つのオプションは次のオプションによって無視され、その逆も同様です。これはマニュアルに記載されています(または参照)。-p
-n
-p
-n
perl -np
perl -p
perl -pn
perl -n
perlrun
man perlrun
perldoc perlrun