Простите мне, если я являюсь неосновным здесь, но не являюсь этим, для чего PIA's Office ?
Моя первая мысль заключалась в том, что это было непонимание некоторой тонкости со стороны Perl, а именно, что скобки вокруг @a
сделали его синтаксическим анализом как попытку присвоения списку . (Сам список, а не обычное назначение списка.) Этот вывод, кажется, поддерживается perldiag:
Невозможно изменить% s в% s
(F) Вам не разрешено назначать указанный элемент, или иным образом попытаться измените его, например, с помощью автоинкремента.
Очевидно, что это не так. Если бы это было так, то должна была быть такая же ошибка:
($x) x= 3; # ok
Более убедительно, это дает ту же ошибку:
@a x= 3; # Can't modify private array in repeat...
Ergo, определенно ошибка. Подайте его.
Я предполагаю, что Perl не является языком с полными символьными преобразованиями. Он пытается понять, что вы имеете в виду. Если вы "перечисляете" @a
, помещая его в скобки, он теряет то, что вы хотели присвоить.
Обратите внимание, что это не делает то, что мы хотим:
my @b = @a x 3; # we'll get scalar( @a ) --> '3' x 3 --> '333'
Но это делает:
my @b = ( @a ) x 3;
Как делает:
( @a ) = ( @a ) x 3;
Таким образом, кажется, что когда выражение фактически появляется с обеих сторон, Perl интерпретирует их в разных контекстах. Он знает, что мы что-то назначаем, поэтому пытается выяснить, что мы назначаем.
Я бы списал это на ошибку из-за очень редко используемого синтаксиса.
Проблема в том, что вы пытаетесь изменить @a на месте, что Perl, очевидно, не позволяет вам делать . Во втором примере выполняется нечто несколько иное, а именно создание нового массива, состоящего из трех повторяющихся @a, а затем перезаписывания этого значения @a.
Возможно, первая форма должна быть прозрачно переведена во вторую форму, но на самом деле это не так. Вы можете считать это ошибкой ... запишите ее в соответствующие места и посмотрите, что произойдет.