@{regions[$reg1]}
- странный и недокументированный способ написания @regions[$reg1]
. (Этот синтаксис задокументирован для использования в строковых литералах в двойных кавычках.)
@regions[$reg1]
- это фрагмент массива с одним элементом, что является странным способом записи $regions[$reg1]
.
вы не получаете первый элемент массива, на который ссылается $regions[$reg1]
, как вы думаете; вы просто получаете первый элемент @regions
.
Давайте рассмотрим
my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
Задача № 1
\@
"cancel out", так что
my $ref1 = \@{$regions[3]};
- это просто сложный способ записи
my $ref1 = $regions[3];
(Хорошо, это не совсем так, потому что первое автоматически активируется, но здесь это не актуально. )
Задача # 2
Снова вы используете фрагмент массива одного элемента. ВСЕГДА используйте use strict; use warnings;
и обращайте внимание на предупреждения!
@{$ref1}[2] = new Point(4, 5);
должно быть
${$ref1}[2] = new Point(4, 5);
, что более аккуратно написано с помощью "обозначения стрелки".
$ref1->[2] = new Point(4, 5);
Задача № 3
Наконец, не используйте косвенные вызовы методов. Они вызывают проблемы.
$ref1->[2] = new Point(4, 5);
должно быть
$ref1->[2] = Point->new(4, 5);
Заключение
my $ref1 = \@{$regions[3]};
@{$ref1}[2] = new Point(4, 5);
должно быть записано как
my $ref1 = $regions[3];
$ref1->[2] = Point->new(4, 5);
Без переменной это будет
$regions[3]->[2] = Point->new(4, 5);
или просто
$regions[3][2] = Point->new(4, 5);