当我将一个 coderef 传递给这个有原型的 Perl 子例程时,为什么会出现语法错误?

7
这是代码:

这是代码:

sub function($&) {
    my $param1 = shift;
    my $code = shift;
    # do something with $param1 and $code
}

如果我像这样调用它:
function("whatever") {
    print "i'm inside the coderef\n";
}

我收到了x.pl文件中第5行的错误提示:Not enough arguments for MyPackage::function at x.pl line 5, near ""whatever" { "。我想知道如何调用它而不必在代码块前添加sub

2个回答

18

将coderef参数放在第一位:

sub function (&$) {
    my $code = shift;
    my $param1 = shift;
    # do something with $param1 and $code
}

function { print "i'm inside the coderef\n" } "whatever";

请参阅perlsub手册,其中部分内容如下:

"&"需要一个匿名子例程,如果作为第一个参数传递,则不需要"sub"关键字或后续的逗号。

5
@Geo,这个可以运行,但你需要更明确一些:function("whatever", sub { print "I'm inside the coderef\n" }); 只有当coderef在第一位时才能使用 name BLOCK EXPR 语法。 - friedo
4
只是因为它是被设计成这样。我怀疑最初允许它的主要原因是让用户编写可以像内置函数一样调用的子程序,这些函数只需要传入一个小的代码片段,就像map和grep一样。但是任何更灵活的东西可能很快会变得令人困惑。 - Sean
@Robert P => 现在Perl可以从Ruby中回溯语法异常了 :-/ - Eric Strom
这就是科技!当然,有了5.12的解析器钩子,我们将能够做更多的事情。 - Robert P
1
当然可以!请查看5.12 Perl Delta (http://search.cpan.org/perldoc?perl5120delta)文档。 - Robert P
显示剩余3条评论

-3
在Perl编程中,$&是一个特殊变量,用于匹配精确的模式(你在上下文中错误地使用了它)。$`用于匹配给定模式之前的字符串。$'用于匹配给定模式之后的字符串。

1
在OP使用的上下文中,它是一个函数原型。请参阅http://perldoc.perl.org/perlsub.html#Prototypes - friedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接