Как я могу преобразовать возвращаемое значение функции из ссылки на массив? - PullRequest
3 голосов
/ 10 апреля 2009

У меня есть этот код в Perl:

sub f {
    return [1,2,3]
}

print f;

Функция f возвращает ссылку на массив, как я могу преобразовать возвращенное значение в массив без дополнительной переменной, как здесь?

sub f {
    return [1,2,3]
}

$a = f;
print @$a;

Ответы [ 2 ]

10 голосов
/ 10 апреля 2009

Вы просто пытаетесь это сделать?

print @{ f() };

Вы можете разыменовать все, что возвращает ссылку. Это не должно быть переменной. Это может быть даже много кода:

print @{ @a = grep { $_ % 2 } 0 .. 10; \@a };

Perl v5.20 добавляет экспериментальную разыменование :

print f()->@*
2 голосов
/ 10 апреля 2009

Вы можете переписать подпрограмму, чтобы она возвращала разные вещи в разных контекстах.

sub f {
  my @return = 1..3;

  return  @return if wantarray;
  return \@return;
  # if you want to return a copy of an array:
  # return [@return];
}

say f;        #   list context => wantarray == 1
say scalar f; # scalar context => wantarray == 0
f();          #   void context => wantarray == undef
123
ARRAY(0x9238880)
my $a_s  = f; # scalar
my($a_l) = f; # list

my @b_l  =        f; # list
my @b_s  = scalar f; # scalar

my %c_l  =        f; # list
my %c_s  = scalar f; # scalar

$a_s ==   [ 1..3 ];
$a_l ==     1;

@b_l == (   1..3   );
@b_s == ( [ 1..3 ] );

%c_l == ( 1 => 2, 3 => undef );
%c_s == ( ARRAY(0x9238880) => undef );

Примечание: вот как подпрограммы Perl6 будут обрабатывать скалярные / списочные контексты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...