为什么Perl sub需要&

时间:2013-02-28 15:36:48

标签: perl compiler-errors subroutine reserved-words

以下文件无法编译:

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(),它就可以了。你能解释一下原因吗?

3 个答案:

答案 0 :(得分:13)

&前缀肯定地说你想调用你自己的名为“s”的函数,而不是任何具有相同名称的内置函数。在这种情况下,它会使替换运算符混淆(例如$stuff =~ s///;,也可以写成s()())。

这是a PerlMonks discussion about what the ampersand does

答案 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开启了。