在perl中使用-e和-s开关

Håk*_*and 6 perl

我开始学习Perl.我试过了

perl -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)

得到:

The value of $x=
Run Code Online (Sandbox Code Playgroud)

然而:

perl -s -x=10 -e 'print "The value of \$x=$x\n";'
Run Code Online (Sandbox Code Playgroud)

No Perl script found in input
Run Code Online (Sandbox Code Playgroud)

我想将-s开关与-e开关一起使用..为什么不能正常工作?

amo*_*mon 11

脚本本身的参数应该在脚本之后,无论它是单行还是文件.虽然并非总是必要,但您可以使用以下命令将perl的参数与脚本的参数分开--:

$ perl -s -E'say "\$x=$x"' -- -x=42
x=42
Run Code Online (Sandbox Code Playgroud)

将参数结束到perl --是必要的,因为它-x是perl本身所理解的标志,因此你的脚本永远不会看到它.来自perldoc perlrun:

-X

-xdirectory

告诉Perl该程序嵌入了大量不相关的文本中,例如邮件消息中.领先的垃圾将被丢弃,直到第一行以"#!"开头.并包含字符串"perl".将应用该行上的任何有意义的开关.

[...]

如果指定了目录名,Perl将在运行程序之前切换到该目录.-x开关仅控制前导垃圾的处理.如果要忽略尾随垃圾,程序必须以" END " 结束 ; 如果需要,程序可以通过"DATA"文件句柄处理任何或所有尾随垃圾.

如果指定了目录,则必须紧跟在-x之后出现,而没有中间空格.

由于指定的输入print "The value of \$x=$x\n";不包含shebang,因此找不到实际的脚本,因此会发出您遇到的错误.

-s除了最简单的单行之外,不要使用switch解析.请Getopt::Long改用.