为什么perl单线性输出取决于开关位置

时间:2013-10-11 11:16:26

标签: perl

您能否解释为什么perl开关-en不起作用,但-ne工作正常?

$ echo 123|perl -en 'print"$_"'
$ echo 123|perl -ne 'print "$_"'
123
$ 

是否可以提供描述此类行为的文档的链接?

3 个答案:

答案 0 :(得分:14)

-e必须遵循perl代码,但它只跟n后面不是实际的一行,所以-en无法按预期工作。

如果您使用-w启用警告,它会给您一个提示:

echo 123|perl -wen 'print"$_"'

Unquoted string "n" may clash with future reserved word at -e line 1.
Useless use of a constant in void context at -e line 1.

答案 1 :(得分:6)

Perlrun是您需要的文档。

在那里你可以找到概要(粗体表示前面提到的-n-e):

perl [-sTtuUWX] [-hv] [-V [:configvar]] [-cw] [-d [t] [:debugger]] [-D [number / list]] [-pna] [-Fpattern] [-l [octal]] [-0 [octal / hexadecimal]] [-Idir] [-m [ - ] module] [-M [ - ]'module .. 。'] [-f] [-C [number / list]] [-S] [-x [dir]] [-i [extension]] [[-e | -E]'command'] < / strong> [ - ] [programfile] [参数] ......

正如您从上面所看到的那样,-e切换在被调用后立即需要'command',使-ne 'command'有效且-en 'command'无效。

答案 2 :(得分:6)

每当Perl解释器看到 -e 选项时,它都需要遵循一行程序。这意味着特定代码行的任何其他选项必须在-e选项之前,否则解释器将得到 confused 。简而言之,它会在 -e 之后将任何选项视为执行的命令。请记住,您可以在一行中使用多个-e。

perl -e "print qq(Hello\n);" -e"print qq(World\n)"
                               ^  
                             Not space needed here.
#Output
Hello
World