原型:返回数组或标量

use*_*275 1 arrays perl reference return-value perl-data-structures

我无法理解如何使用子程序原型返回数组.这是一个例子

sub f (&@) {
        my ($func) = @_;        
        eval &$func;
}

my $a = f {return 1};
my @b = f {return (2,1,1,4)};

print "a = ".$a."\n";
print "b = ".scalar(@b)."\n";
Run Code Online (Sandbox Code Playgroud)

这种输出a = 1b = 1,但我希望@b有长度为4.

我也尝试\ eval &$func在函数中返回引用f.然后我可以取消引用标量($$a是1),但是当解除引用数组(@$b)时perl告诉我它不是数组引用.

Okt*_*ist 5

原型对子例程是返回标量还是列表没有影响.使用wantarray,如果你想在一个子程序调用的是哪个方面来认识.

eval &$func;
Run Code Online (Sandbox Code Playgroud)

上面的行首先调用$func在标量上下文中引用的子例程,然后将其返回值转换为字符串并将该字符串作为Perl程序执行.

sub f (&) {
    my ($func) = @_;
    eval { &$func }
}
Run Code Online (Sandbox Code Playgroud)

这将执行您显然想要的操作(在一个块中调用$func在其f自身被调用的相同上下文(标量或列表)中引用的子例程eval以捕获运行时错误).

sub f (&) {
    my ($func) = @_;
    eval { $func->(@_) }
}
Run Code Online (Sandbox Code Playgroud)

这是更现代的风格,与->运营商.

  • 您可能想要添加的一个关键点是`eval&$ func`将在**标量上下文中调用`$ func`**(这就是为什么它只返回"4"),而`eval {$ func-> ()}`将从函数调用继承列表或标量上下文到`f()`,因此应按预期工作. (3认同)