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 = 1和b = 1,但我希望@b有长度为4.
我也尝试\ eval &$func在函数中返回引用f.然后我可以取消引用标量($$a是1),但是当解除引用数组(@$b)时perl告诉我它不是数组引用.
原型对子例程是返回标量还是列表没有影响.使用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)
这是更现代的风格,与->运营商.