Программирование на Perl и возвращаемые значения - PullRequest
2 голосов
/ 14 апреля 2011

Как вы возвращаете значение массива локальной переменной (или любой другой переменной) в perl. Например. Должен ли я вернуть ссылку на массив. Кажется, это не сработает.

sub routine 
{
my @array = ("foo", "bar");  
return @array;  
}  

Но, похоже, это не работает. Как вы возвращаете значения из локальных переменных в Perl?

Мой второй связанный вопрос, например, как мне получить доступ к вложенному массиву как к массиву. Предыдущий вопрос также создает необходимость в этом решении.

@nestedArray = ("hello", "there");  
@array = ("the", \@nestedArray);  

($variable1, $variable2) = values @array;  

Это то, что я пробовал

($variable3, $variable4) values $$variable2; ## This doesn't seem to work?  

: - /

Ответы [ 5 ]

3 голосов
/ 14 апреля 2011

На ваш второй вопрос вы должны прочитать perlreftut , чтобы прояснить ваше понимание ссылок.

Кроме того, хотя keys и values будут технически работать с массивами, они 'на самом деле они не предназначены для использования на них.Это красная сельдь.

2 голосов
/ 14 апреля 2011
sub routine {
    my @array = ( "foo", "bar" );
    return @array;
}

print join "\n", routine();

Вышеприведенное действительно возвращает список.

@nested_array = ( "hello", "there" );  
@array = ( "the", \@nested_array );  

print join "\n", ( $array[0], @{ $array[1] } );

Здесь первый элемент @array равен the, а второй элемент является ссылкой на массив.Поэтому вы должны разыменовать второй элемент как массив.

Однако для простоты вы можете сгладить второй массив в список:

@array = ( "the", @nested_array );
print join "\n", @array;
0 голосов
/ 14 апреля 2011

Во-первых, вы поступили правильно.Но я думаю, что вы вызываете функцию в скалярном контексте, поэтому вы получаете только количество элементов в списке / массиве.

sub routine 
{
  my @array = ("foo", "bar");  
  return @array;  
}  

my $a = routine(); # a will be **2** instead of an array ("foo", "bar")
my @a = routine(); # a will be an array ("foo", "bar")

Если вам действительно нужно вернуть массив, и вы хотите убедиться, что подпрограмма была вызвана правильно.Вы можете использовать функцию wantarray().

sub routine 
{
  my @array = ("foo", "bar");  

  return @array if wantarray;  

  die "Wrong invoking context";
}  

Во-вторых, вы можете использовать push;

@nestedArray = ("hello", "there");  
@narray = ("the", "world");

push @narray, @nestedArray; # @narray is ("the", "world", "hello", "there")
0 голосов
/ 14 апреля 2011

Обычно вы возвращаете ссылки на нескалярные переменные или скалярные значения напрямую.

return $var
or 
return \@var
or 
return \%var

затем разыменуйте их как% $ var или @ $ var или используйте обозначение стрелки

$ var -> [0] или $ var -> {hash_key}

0 голосов
/ 14 апреля 2011

Для второго это работает:

($variable3, $variable4) = @$variable2;

Ваш первый пример работает так, как если бы он у вас был.

...