Как я могу передать два списка подпрограмме Perl?

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

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

}

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

5
задан brian d foy 22 May 2010 в 15:44
поделиться

2 ответа

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

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 , чтобы получить хорошее руководство.

10
ответ дан 18 December 2019 в 11:54
поделиться

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

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";
}
5
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: