Ответ 1
use strict; use warnings;
. Всегда.
Ваша хэш-декларация не делает то, что, по вашему мнению, она делает, имеет нечетное количество элементов.
Попробуйте следующее:
use Data::Dumper;
my %hash = ( 0=> , 1=>"Man");
print Dumper(%hash);
Вы увидите, что $hash{0}
установлен в 1, $hash{"Man"}
существует, но есть undef
, а $hash{1}
вообще не существует. т.е. ваша хэш-декларация эквивалентна:
my %hash = (0 => 1, "Man" => undef);
Почему это происходит? Это потому, что:
=>
по существу является эквивалентом ,
Конструкторы значений списка работают таким образом, например. ($a,,$b)
эквивалентно ($a,$b)
Соответствующие кавычки из этого документа:
Оператор
=>
в основном представляет собой скорее более визуально отличительный синоним для запятой, но также упорядочивает его левый операнд, который будет интерпретироваться как строка, если это будет гоночное слово, которое будет юридический простой идентификатор.
и
Нулевой список представлен
()
. Интерполирование его в списке не влияет. Таким образом,((),(),())
эквивалентно()
. Точно так же интерполяция массива без элементов такая же, как если бы ни один массив не был интерполирован в этой точке.(...)
Список
1,,3
представляет собой конкатенацию двух списков:1,
и3
, первая из которых заканчивается эта дополнительная запятая.1,,3
(1,),(3)
1,3
(И аналогично для1,,,3
(1,),(,),3
1,3
и т.д.) Не то, чтобы мы советовали вам использовать эту обфускацию.
Примените это к вашему коду:
(0 => , 1 => "Man");
is (0 , , 1 , "Man");
is (0 , 1 , "Man");