嘿。在Python中我可以这样做:
def fnuh():
a = "foo"
b = "bar"
return a,b
我可以在perl中以类似优雅的方式返回一个列表,特别是当子例程的返回类型应该是对数组的引用时吗?
我知道我能做到
sub fnuh {
my $a = "foo";
my $b = "bar";
my $return = [];
push (@{$return}, $a);
push (@{$return}, $b);
return $return;
}
但我敢打赌,在Perl中有更好的方法。你知道吗?
答案 0 :(得分:8)
当然,只需在列表前面拍一个\
即可返回参考。
或使用[ list elements ]
创建一个新的arrayref。
在您的示例中,
sub f1 {
my $a = "foo";
my $b = "bar";
return [ $a, $b ];
}
sub f2 {
my $a = "foo";
my $b = "bar";
push @return, $a, $b;
return \@return;
}
有关参考资料的详情,请参阅perldoc perlreftut和perldoc perlref。在perldoc perldsc还有一个数据结构食谱。
您可能还想在perlfaq中阅读此问题(感谢brian):"What's the difference between a list and an array?"
答案 1 :(得分:6)
Python会自动打包和解包模拟列表的赋值周围的元组。在Perl中,您可以以相同的方式编写它,返回一个列表。
sub fnuh {
my $a = 'foo';
my $b = 'bar';
$a, $b
}
然后使用结果:
my ($x, $y) = fnuh;
或者如果您需要参考:
my $ref = [ fnuh ];
答案 2 :(得分:-1)
通过使用函数wantarray
显式测试上下文是否 数组,您可以获得与Python相同的功能。
sub fnuh {
my $a = 'foo';
my $b = 'bar';
return wantarray ? ( $a, $b ), [ $a, $b ];
}
或者如果你想要做很多事情,你可以编写一个能够读取相同上下文的函数,只要你没有改变它。
sub pack_list {
my $want = wantarray;
return unless defined $want; # void context
return $want ? @_ : \@_;
}
然后这样称呼:
return pack_list( $a, $b );