我开始学习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
开关一起使用..为什么不能正常工作?
答案 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”。