Perl смущен типом
Perl пытается понять, что '{$ array_reference}' является типом массива
Хорошо,это не тип массива.Perl не "борется";у вас просто неправильные ожидания.
Общее правило (как объяснено в perldoc perlreftut
): Вы всегда можете использовать ссылку в фигурных скобках вместоимя переменной.
Таким образом:
@array # a whole array
@{ $array_ref } # same thing with a reference
$array[$i] # an array element
${ $array_ref }[$i] # same thing with a reference
$#array # last index of an array
$#{ $array_ref } # same thing with a reference
С другой стороны, с
my @array = {$array_reference};
происходит то, что вы используете синтаксис для ссылки на хешконструктор, { LIST }
.Предупреждение возникает потому, что в рассматриваемом списке должно быть четное количество элементов (для ключей и значений):
my $hash_ref = {
key1 => 'value1',
key2 => 'value2',
};
То, что вы написали, рассматривается как
my @array = ({
$array_reference => undef,
});
, то естьмассив, содержащий единственный элемент, который является ссылкой на хеш, содержащий единственный ключ, который является строковой ссылкой (и имеет значение undef
).
Синтаксическая разница между разыменованием и конструктором hashrefчто разыменование начинается с символа (например, $
, @
или %
), тогда как конструктор хеш-ссылки начинается с простого {
.
Технически говоря, {
}
в синтаксисе разыменования представляет собой фактический блок кода:
print ${
print "one\n"; # yeah, I just put a statement in the middle of an expression
print "two\n";
["three"] # the last expression in this block is implicitly returned
# (and dereferenced by the surrounding $ [0] construct outside)
}[0], "\n";
По (надеюсь) очевидным причинам, никто в действительности не делает этого в реальном коде.