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 ведет себя как скаляр независимо от используемого сигила?

Спасибо.


person Badder    schedule 01.01.2015    source источник
comment
включить предупреждения! perl -wle расскажет другую историю для второго случая   -  person ysth    schedule 01.01.2015


Ответы (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 одним элементом, второй оператор просто печатает этот массив. Опять же, контекст имеет значение.

person raina77ow    schedule 01.01.2015