如何在Perl中将列表作为数组引用返回?

时间:2010-01-14 16:15:52

标签: perl reference

嘿。在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中有更好的方法。你知道吗?

3 个答案:

答案 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 perlreftutperldoc 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 );