以下命令按预期工作:
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)/ 则无法打开 print $1:没有这样的文件或目录。
这是什么原因呢?
答案1
该-e
选项采用一个参数,一个将被计算为 Perl 代码的字符串。当您使用时perl -lne '...'
,perl -nle '...'
这将按预期工作,因为选项的顺序并不重要(在本例中)。
但是,当您使用 时perl -nel '...'
,您会说“将字符串评估l
为 Perl 代码,并用作'...'
该代码要读取的文件的名称”,这没有什么意义(这就是为什么您会看到奇怪的“没有这样的文件或目录”错误)。
所以,不,选项的顺序并不重要(这里),但是如果你移动选项-e
,你必须移动选项参数、Perl 代码,这样 Perl 代码总是直接在它之后选项。
因此,例如,如果您想将该-e
选项放在第一位,请使用
perl -e '...' -ln
如果您在同一命令行上混合使用和等选项,则选项的顺序perl
非常重要。一个选项将被后面的选项覆盖,反之亦然,所以与 相同,而与 相同。这在手册中有记录(请参阅或)。-p
-n
-p
-n
perl -np
perl -p
perl -pn
perl -n
perlrun
man perlrun
perldoc perlrun
答案2
perl ... [ [-e|-E] 'command' ] ...
Perl 将选项后面的任何内容-e
视为命令。其中-nel
,l
是 的命令-e
。print $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/
是第一个非选项参数,它成为 perl 尝试打开但失败的输入文件。
比较一下,说:
~ echo foo | perl -neprint
foo