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");