Вам нужно передать каждый из массивов в качестве ссылки, иначе ваш @x в подпрограмме сожрет ВЕСЬ массив аргументов, оставив @y пустым массивом, а $z значением undef.
Это происходит потому, что оператор запятая в контексте списка превращает @x, @y, $z в единый массив, состоящий из всех элементов @x, за которыми следуют все элементы @y, а затем значение $z; ваш @x в подпрограмме поглотит ВЕСЬ комбинированный массив аргументов, оставив @y пустым массивом, а $z значением undef.
Еще одним возможным источником путаницы является тот факт, что вы назвали обе переменные @x, несмотря на то, что они полностью независимы друг от друга из-за правил области видимости. Хорошей практикой было бы назвать их чем-то отличным, чтобы не угадывать, какой из них вы хотели использовать, например. вызовите первый массив подпрограммы @x2.
Обратите внимание, что вы можете передать массив в качестве ссылки одним из двух способов — ссылкой на исходный массив (реальный подход передачи по ссылке), а также ссылкой на КОПИЮ массива — которая будет вести себя так, как вы хотели, чтобы ваш исходный код для поведения и передачи по значению.
use strict; use warnings;
my @x = qw(AAAA BBBB CCCC DDDD EEEE);
my @y = qw(1111 2222 3333 4444 5555);
my $z = "hello";
Hello(\@x,\@y,$z);
# If you wish to pass a reference of a COPY of the array,
# so that you can modify it inside the subroutine without modifying the original,
# instead call Hello([@x], [@y], $z);
exit(0);
sub Hello {
my ($x2,$y2,$z2) = @_;
# Now, you de-reference array reference $x2 via @$x2 or $x2->[$i]
# where previously you used @x2 or $x2[$i]
print "$_\n" for @$x2;
print "$_\n";
print "$_\n" for @$y2;
print "$_\n";
print "$z2\n";
}
person
DVK
schedule
21.10.2010