为什么perl oneliner输出取决于开关位置

bes*_*bov 5 perl

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

$ echo 123|perl -en 'print"$_"'
$ echo 123|perl -ne 'print "$_"'
123
$ 
Run Code Online (Sandbox Code Playgroud)

您能否提供一个文档的链接,描述这种行为?

Сух*_*й27 14

之后-e必须遵循perl代码,但它只遵循n不是实际的一个衬里,所以-en不能按预期工作.

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

echo 123|perl -wen 'print"$_"'
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)


psx*_*xls 6

Perlrun是您需要的文档.

在那里,你可以找到简介(粗体显示的上述-n-e):

perl [-sTtuUWX] [-hv] [-V [:configvar]] [-cw] [-d [t] [:debugger]] [-D [number/list]] [-pna] [-Fpattern] [ -l [八进制]] [-0 [八进制/十六进制]] [-Idir] [-m [ - ]模块] [-M [ - ]'模块...'] [-f] [-C [数字/ list]] [-S] [-x [dir]] [-i [extension]] [[-e | -E]'command'] [ - ] [programfile] [参数] ......

因此,正如您从上面所看到的,-e交换机'command'在被调用之后立即需要,使得-ne 'command'有效和-en 'command'无效.

  • 你关于''命令''需要立即跟随`-e`的观点是有效的.关于需要模仿它们在概要中出现的顺序的选项顺序,你的观点是一个红色的鲱鱼. (2认同)

edi*_*len 6

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

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