Как мне вернуть список как ссылку на массив в Perl? - PullRequest
2 голосов
/ 14 января 2010

Эй. В 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 ]

8 голосов
/ 14 января 2010

Конечно, просто нажмите \ перед списком, чтобы получить ссылку.

Или создайте новый arrayref с [ list elements ].

В вашем примере,

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 (спасибо Брайану): «В чем разница между списком и массивом?»

6 голосов
/ 14 января 2010

Python автоматически упаковывает и распаковывает кортежи вокруг имитации списков назначений. В Perl вы можете написать это так же, возвращая список.

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

затем использовать результат:

my ($x, $y) = fnuh;

или если вам нужна ссылка:

my $ref = [ fnuh ];
0 голосов
/ 14 января 2010

Вы можете получить ту же функцию, что и Python, явно проверив, хочет ли контекст * массив с помощью функции wantarray.

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...