3

以下文件无法编译:

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

4

3 回答 3

13

& 前缀明确表示你想调用你自己的名为“s”的函数,而不是任何具有相同名称的内置函数。在这种情况下,它对于替换运算符(如$stuff =~ s///;,也可以写成s()())感到困惑。

是 PerlMonks 关于 & 符号的讨论

于 2013-02-28T15:41:32.257 回答
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();
于 2013-02-28T16:03:16.097 回答
1
 my $s = 's'->();

也可以工作——奇怪的是stricton。

于 2013-02-28T16:03:16.427 回答