Действительно ли возможно передать два списка a sub
в Perl, например:
sub Foo {
my(@list1,@list2) = @_;
}
Я знаю, что мог сделать @_
два списка, при этом каждый подсписок является желаемым аргументом, я просто задаюсь вопросом, существует ли более чистый путь
Что ж, если вам нужны два массива , вы можете использовать прототип:
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 , чтобы получить хорошее руководство.
Если вы передадите два списка по значению ... вы получите один большой список в @_
.
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";
}