Просто починаючи з Perl, я використовував неправильну пару круглих дужок для цього прикладу коду:
@arr = {"a", "b", "c"};
print "$_n" foreach @arr;
Я маю на увазі, я, звичайно, бачу, що це робить, коли я його запускаю, але я не розумію, ЧОМУ це робить. Не треба, що просто не вдається з синтаксичною помилкою?
Відповіді:
3 для відповіді № 1Ви випадково створили анонімний хеш, який є хеш, який не має ідентифікатора і доступний лише за посиланням.
Масив @arr
встановлено на одиничний елемент, який є посиланням на цей хеш. Правильно написаний це буде виглядати так
use strict;
use warnings;
my @arr = (
{
a => "b",
c => undef,
}
);
print "$_n" foreach @arr;
саме тому ви отримали вихід
HASH(0x3fd36c)
(або щось подібне), тому що це означає, що Perl буде представляти хеш-посилання як рядок.
Якщо ви хочете експериментувати, то ви можете роздрукувати значення першого хеш-елемента за допомогою $arr[0]
як хеш-посилання (масив має лише один елемент у нульовому індексі) та доступ до значення елемента за допомогою ключа a
з print $arr[0]->{a}, "n"
.
Зауважте, що оскільки хеш повинен мати кілька значень (набір пар ключ / значення), хеш у вашому власному коді неявно розширюється до чотирьох значень, додавши undef
до кінця.
це є життєво важливий що ви додаєте use strict
і use warnings
до вершини кожної програми Perl, яку ви пишете. У цьому випадку останнє б підняло попередження
Odd number of elements in anonymous hash
3 для відповіді № 2
Можна здивувати те, наскільки мало значення є синтаксичні помилки в Perl. У цьому випадку ви наткнулися на синтаксис для створення анонімного посилання на хеш: { LIST }
. Perl не вимагає використання дужок ( ()
kind) при ініціалізації масиву1. Масиви зберігають упорядковані списки скалярних (одиничних) значень та посилань - скаляри, так що perl ініціалізує ваш масив за допомогою цього посилання як єдиний елемент.
Це не те, що ти хотів, але це абсолютно правильно Perl.
The ()
перевизначає перевагу операторів і тим самим змінює поведінку виразу. @a = (1, 2, 3)
робить те, що ви очікуєте, але @a = 1, 2, 3
засоби (@a = 1), 2, 3
, тому він призначає лише 1
до @a
.
2 для відповіді № 3
{ LIST }
є хеш-конструктором. Він створює хеш, присвоює результат LIST
до нього, і повертає посилання на це.
my $h = {"a", "b", "c", "d"};
say $h->{a}; # b
Список одного хеш-рефу так само легітимно, як і будь-який інший список, так ні, це не повинно бути синтаксичною помилкою.