Perl: назначить скаляр непосредственно хешу

Глядя на некоторый код Perl, я натолкнулся на назначение вывода chr непосредственно хешу:

local %str = chr(shift);

Смущенный, что код работал хорошо, это заставило меня понять следующее:

perl -le 'my $jurso = 23; print $jurso;'
23

perl -le 'my %jurso = 23; print %jurso;'
23

perl -le 'my @jurso = 23; print @jurso;'
23

Я ожидал, что присвоение скаляра непосредственно хешу или массиву приведет к ошибке. Может кто-нибудь объяснить, почему переменная jurso ведет себя как скаляр независимо от используемого символа?

Благодарю.

1 ответ

Решение

Два слова: контекст имеет значение. Проще понять, что здесь происходит, если вы включите warnings на:

> perl -wle 'my %jurso = 23; print %jurso;'
Odd number of elements in hash assignment at -e line 1.
Use of uninitialized value $jurso{"23"} in print at -e line 1.
23

Другими словами, первый оператор вашего кода создает хэш из списка из одного элемента. Это не очень хороший знак (поскольку хэши обычно должны иметь четное количество элементов в списке источников), отсюда и первое предупреждение. Тем не менее, хеш создается: он имеет один элемент, адресованный ключом 23 и значение этого элемента undef,

Второе утверждение пытается напечатать этот хеш, сначала он повторяет ключ (23), а затем его значение. Это undef Как вы помните, отсюда и второе предупреждение. Тем не менее, это значение выводится на печать - в виде пустой строки.)

С массивами у вас даже не будет предупреждений:

> perl -wle 'my @jurso = 23; print @jurso;'
23

... как заполняется первое утверждение @jurso массив с одним элементом, второй оператор просто печатает этот массив. Опять же, контекст имеет значение.

Другие вопросы по тегам