2015-01-01 2 views
1

Хотя глядя на некоторый код Perl, я наткнулся на уступки выхода CHR непосредственно на хэш:Perl: назначить скаляр непосредственно на хэш

local %str = chr(shift); 

Confused, что код работает нормально, это сделал я понимаю, следующее:

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

Спасибо.

+5

включить предупреждения! perl -wle расскажет другую историю для второго случая – ysth

ответ

5

Два слова: вопросы контекста. Это легче понять, что происходит здесь, если вы включите 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 массив одного элемента, то второе утверждение просто печатает этот массив. Опять же, контекст имеет значение.

Смежные вопросы