我在 perl 文件中有以下代码。此命令的目的是在 file.txt.system(\' find . -type f -name file.txt | xargs sed -i -e \'$ ... 的末尾添加一行 \'- - test 0\'
我在 perl 文件中有以下代码。此命令的目的是在 file.txt 末尾添加一行 \'- - test 0\'。
system(" find . -type f -name file.txt | xargs sed -i -e "$ a- - test 0" ");
当我尝试运行脚本时,出现如下所示的错误。
Scalar found where operator expected at timeStampConfig.pl line 24, near "" find . -type f -name file.txt | xargs sed -i -e "$ a"
(Missing operator before $ a?)
Number found where operator expected at timeStampConfig.pl line 24, near "test 0"
(Do you need to predeclare test?)
String found where operator expected at timeStampConfig.pl line 24, near "0" ""
(Missing operator before " "?)
syntax error at timeStampConfig.pl line 24, near "" find . -type f -name file.txt | xargs sed -i -e "$ a"
Execution of timeStampConfig.pl aborted due to compilation errors.
我尝试从命令提示符执行下面的行并且运行良好。
find . -type f -name file.txt | xargs sed -i -e '$ a- - test 0'
我也尝试使用单引号,如下所示,但最终出现错误。
system("find . -type f -name file.txt | xargs sed -i -e '$ a- - test 0'");
sed: -e expression #1, char 1: unknown command: `-'
我是 perl 新手,需要一些帮助。
原型会改变用它们声明的函数的解析规则。因此,为了将其考虑在内, 必须 函数的 sub foo();
预声明 (
如果函数调用出现在函数定义或预声明之前,则只能将其解析为普通(非原型)调用,前提是解释器首先可以确定它是一个函数。(在此示例中,由于括号,因此可以。)
然后,一旦定义出现,指示的原型就不会对已解析的调用产生影响。但是,在函数定义(或预声明)之后,对该函数的进一步调用都是原型化的。另外还添加了一点:
use 5.016;
fun_proto(42); # runtime warning:
# "called too early to check prototype"
sub fun {
fun_proto(42); # parsed as a normal sub as no prototype has been seen
}
sub fun_proto() {
say "@_";
}
fun(); # fun_proto(42) call in 'fun' is OK
fun_proto(43); # compilation error: extra argument by prototype
函数定义之前的直接调用会在运行时引发警告,但另一个子程序内部的调用不会。我不知道为什么来自子程序的调用不会收到警告。(包含调用的子程序的调用 fun_proto(42)
出现在 fun_proto
定义之后,但所有这些(封闭的子程序和 fun_proto
其中的调用)都在定义之前进行编译。)
要修复†代码,请在提及函数之前添加预声明(“前向声明”)。在此示例中,这将是一个语句 sub fun_proto();
也许你确切地知道自己在做什么,但我不得不问:你的代码中真的需要原型吗?它们很微妙,但它们的目的仅仅是允许像调用内置函数一样调用用户定义的子函数,而 不是检查参数的数量和类型 .
如果目的是检查参数,那么自 v5.20 perl 以来,它具有适当的 子程序签名 .
†一个真正的问题是,代码的编译方式取决于原型,因此当它们没有按预期应用时(如这里),可能会导致安静的错误。一个简单的例子:
sub fun() { ... }
当调用该子程序(不带括号)时,其调用之后的任何内容都不会作为其参数——因为它不接受任何参数!——所以
fun + 3 # intended to be compiled with regards to () prototype
稍后(虽然很棘手)运行为
fun() + 3 # sub declared w/ prototype to take no arguments
但是,如果该原型定义不适用于此调用(如本问题中的示例),则表达式中 sub 后面的内容 将 作为其参数列表,因此代码将被编译为
fun(+3) # oups, not intended (prototype unused by error)
没有警告。