How do I return a list as an array reference in Perl?

此生再无相见时 提交于 2019-12-22 11:28:06

问题


Hey. In Python I can do this:

def fnuh():
    a = "foo"
    b = "bar"
    return a,b

Can I return a list in a similarly elegant way in perl, especially when the return type of the subroutine should be a reference to an array?

I know I can do

sub fnuh {
    my $a = "foo";
    my $b = "bar";
    my $return = [];
    push (@{$return}, $a);
    push (@{$return}, $b);
    return $return;
}

But I bet there is a better way to do that in Perl. Do you know it?


回答1:


Sure, just slap a \ in front of the list to return a reference.

Or make a new arrayref with [ list elements ].

In your example,

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;
}

Please see perldoc perlreftut and perldoc perlref for more about references. There is also a data structures cookbook at perldoc perldsc.

You may also want to read this question in the perlfaq (thanks brian): "What's the difference between a list and an array?"




回答2:


Python automatically packs and unpacks tuples around an assignment simulating lists. In Perl, you can write it the same way, returning a list.

sub fnuh {
    my $a = 'foo';
    my $b = 'bar';
    $a, $b
}

then to use the result:

my ($x, $y) = fnuh;

or if you need the reference:

my $ref = [ fnuh ];



回答3:


You can get the same function as Python by explicitly testing whether the context wants an array with the function wantarray.

sub fnuh {
    my $a = 'foo';
    my $b = 'bar';
    return wantarray ? ( $a, $b ), [ $a, $b ];
}

Or if you want to do this a lot, you could write a function that will be able to read the same context, as long as you have not altered it.

sub pack_list { 
    my $want = wantarray; 
    return unless defined $want; # void context
    return $want ? @_ : \@_;
}

Then call it like this:

return pack_list( $a, $b );


来源:https://stackoverflow.com/questions/2065579/how-do-i-return-a-list-as-an-array-reference-in-perl

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!