以下文件无法编译:
sub s {
return 'foo';
}
sub foo {
my $s = s();
return $s if $s;
return 'baz?';
}
perl -c
的错误是:
syntax error at foobar.pl line 5 near "return"
(Might be a runaway multi-line ;; string starting on line 3)
foobar.pl had compilation errors.
但如果我用s()
替换&s()
,它就可以了。你能解释一下原因吗?
答案 0 :(得分:13)
&前缀肯定地说你想调用你自己的名为“s”的函数,而不是任何具有相同名称的内置函数。在这种情况下,它会使替换运算符混淆(例如$stuff =~ s///;
,也可以写成s()()
)。
答案 1 :(得分:3)
正如已经指出的那样,您遇到的问题是s()
被解释为s///
替换运算符。使用&符号对函数名称进行前缀是一种解决方法,但我不一定说正确的。在perldoc perlsub中,以下是关于调用子例程的说法:
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.
&符号在这里做的只是区分内置函数和你自己的函数。
除了重新命名子程序之外,处理此问题的“正确”方法是实现表面下发生的事情。当你说
s();
你真正说的是
CORE::s();
当你的意思是
main::s();
答案 2 :(得分:1)
my $s = 's'->();
也很有用 - 奇怪的是strict
开启了。