Почему я получаю ошибку, когда я пытаюсь использовать reptition оператор присваивания с массивом?

Простите мне, если я являюсь неосновным здесь, но не являюсь этим, для чего PIA's Office ?

7
задан Chas. Owens 8 September 2009 в 16:44
поделиться

3 ответа

Моя первая мысль заключалась в том, что это было непонимание некоторой тонкости со стороны Perl, а именно, что скобки вокруг @a сделали его синтаксическим анализом как попытку присвоения списку . (Сам список, а не обычное назначение списка.) Этот вывод, кажется, поддерживается perldiag:

Невозможно изменить% s в% s

(F) Вам не разрешено назначать указанный элемент, или иным образом попытаться измените его, например, с помощью автоинкремента.

Очевидно, что это не так. Если бы это было так, то должна была быть такая же ошибка:

($x) x= 3;  # ok

Более убедительно, это дает ту же ошибку:

@a x= 3;  # Can't modify private array in repeat...

Ergo, определенно ошибка. Подайте его.

4
ответ дан 7 December 2019 в 12:23
поделиться

Я предполагаю, что 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 интерпретирует их в разных контекстах. Он знает, что мы что-то назначаем, поэтому пытается выяснить, что мы назначаем.

Я бы списал это на ошибку из-за очень редко используемого синтаксиса.

1
ответ дан 7 December 2019 в 12:23
поделиться

Проблема в том, что вы пытаетесь изменить @a на месте, что Perl, очевидно, не позволяет вам делать . Во втором примере выполняется нечто несколько иное, а именно создание нового массива, состоящего из трех повторяющихся @a, а затем перезаписывания этого значения @a.

Возможно, первая форма должна быть прозрачно переведена во вторую форму, но на самом деле это не так. Вы можете считать это ошибкой ... запишите ее в соответствующие места и посмотрите, что произойдет.

0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: