Изменение массива в подпрограмме

У меня есть некоторый код, который работает не так, как я ожидаю, и я был бы признателен за помощь в выяснении того, как заставить его работать так, как я ожидаю.

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


my @test_array = qw (zero one two three);

shift_array(\@test_array);
print "POST SUBROUTINE: $test_array[0]\n";

sub shift_array {
    my @array = @{(shift)};
    shift @array;
    print "AFTER SHIFT IN SUB: $array[0]\n";
}

Это напечатает:

AFTER SHIFT IN SUB: one
POST SUBROUTINE: zero

Я ожидал, что оно напечатает oneоба раза.

Так что мой вопрос двоякий-кратный:

1)Почему он не ведет себя так, как я думаю, он должен? Создает ли передача ссылки на массив копию массива?

2)Как добиться того поведения, которое Я ОЖИДАЛ? Как мне получить подпрограмму для сдвига одного или нескольких элементов из передней части копии входного массива вызывающего абонента?

Заранее благодарим за любую информацию, которую вы можете предложить.

14
задан BlairHippo 3 April 2012 в 14:53
поделиться