В Perl все списки плоские.Эти два списка эквивалентны.
( 1, 2, ( 3, 4, ( 5 ), (6, 7), 8), (), )
( 1, 2, 3, 4, 5, 6, 7, 8 )
То же самое происходит и тогда, когда вы берете несколько массивов и помещаете их в список.
my @foo = (1, 2, 3);
my @bar = (4, 5, 6);
my @new = (@foo, @bar); # 1, 2, 3, 4, 5, 6
Когда вы передаете вещи в функцию, эти вещипревратиться в список аргументов.Следовательно, оба массива окажутся в одном списке, как @foo
и @bar
выше.
frobnicate(@foo, @bar);
Когда вы назначаете что-либо в контексте списка, весь список будет назначен слева направо.Для скаляров в списке слева это означает, что они получат свои значения.Но как только появится массив, он будет жадным.Он поглотит все оставшиеся значения.
my ($one, $two, @rest, $will_be_undef) = (1, 2, 3, 4, 5, 6);
Значения будут присвоены так:
$one = 1;
$two = 2;
@rest = ( 3, 4, 5, 6 );
$will_be_undef = undef;
Что нужно сделать, чтобы передать два массива, это взятьссылки и разыменование их в нашей функции.
frobnicate( \@foo, \@bar );
sub frobnicate {
my ($first_array, $second_array) = @_;
my @foo = @{ $first_array };
my @bar = @{ $second_array };
...
}