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

时间:2014-02-01 08:53:45

标签: perl

我开始学习Perl。我试过了

perl -e 'print "The value of \$x=$x\n";'

给出:

The value of $x=

,而:

perl -s -x=10 -e 'print "The value of \$x=$x\n";'

给出

No Perl script found in input

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

2 个答案:

答案 0 :(得分:11)

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

$ perl -s -E'say "\$x=$x"' -- -x=42
x=42

使用--将参数结束到perl是必要的,因为-x是perl自己理解的标志,因此您的脚本永远不会看到它。来自perldoc perlrun

  

-x

     

-xdirectory

     

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

     

[...]

     

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

     

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

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

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

答案 1 :(得分:3)

perl -se 'print "The value of \$x=$x\n";' -- -x=10

perlrun documentation可以更清楚地了解此选项,

  

-s   在程序名之后但在任何文件名参数之前(或在 - 的参数之前),允许对命令行上的开关进行基本的开关解析。找到的任何开关都从@ARGV中删除,并在Perl程序中设置相应的变量。如果使用-xyz开关调用程序,则以下程序打印“1”;如果使用-xyz = abc调用该程序,则打印“abc”。