Perl 中命令行选项的顺序重要吗?

Perl 中命令行选项的顺序重要吗?

以下命令按预期工作:

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-nperl -npperl -pperl -pnperl -nperlrunman perlrunperldoc perlrun

答案2

perlrun帮助页:

perl ... [ [-e|-E] 'command' ] ...

Perl 将选项后面的任何内容-e视为命令。其中-nel,l是 的命令-eprint $1 if /install\(TARGETS (.*) RUNTIME DESTINATION bin\)/是第一个非选项参数,它成为 perl 尝试打开但失败的输入文件。

比较一下,说:

~ echo  foo | perl -neprint
foo

相关内容