Как я могу передать два списка в подпрограмму Perl? - PullRequest
5 голосов
/ 21 мая 2010

Можно ли передать два списка в sub в Perl, например:

sub Foo {
 my(@list1,@list2) = @_;

}

Я знаю, что могу создать @_ два списка, каждый из которых является желаемым аргументом, мне просто интересно, есть ли более чистый способ

Ответы [ 2 ]

10 голосов
/ 21 мая 2010

Ну, если вам нужно два массива , вы можете использовать прототип:

sub foo (\@\@) {
   my $arr1 = shift;
   my $arr2 = shift;

   # Access arrays as references
}

foo( @wiz, @waz );  # @wiz and @waz won't be flattened.

Но есть много способов обойти прототипы, и я предпочитаю избегать их в большинстве мест. Вы можете просто пропустить прототип и вручную передать ссылки:

sub foo {
   my $arr1 = shift;
   my $arr2 = shift;

   # Access arrays as references
}

foo( \@wiz, \@waz ); # Pass in wiz/waz as refs
foo( [1,2,4],[3,5,6] );  # Hard coded arrays

Если вы вообще не работали со ссылками, посмотрите perlreftut для хорошего урока.

5 голосов
/ 21 мая 2010

Если вы передадите два списка по значению ... вы получите один большой список в @_.

my(@list1,@list2) = @_; не имеет никакого смысла:

#!/usr/bin/perl

sub test
{
    my (@a, @b) = @_;

    print "@a\n";
    print "@b\n";
}

my @array1 = (1,2,3);
my @array2 = (5,6,7);

test(@array1, @array2);

Это закончится печатью:

1 2 3 5 6 7
<blank line> 

Чтобы передать два массива, вам нужно передать их по ссылке:

test(\@array1, \@array2);

И в вашем сабе вам нужно рассматривать их как ссылки:

sub test
{
    my ($arrayRef1, $arrayRef2) = @_;
    print "@$arrayRef1\n";
    print "@$arrayRef2\n";
}
...