Разница в том, что назначение %h1
совершенно неверно, а назначение %h2
почти правильно.
Perl использует скобки для создания списка , который может быть присвоен массиву или хешу:
@a = (1, 2, 3);
%a = (foo => 'bar', 7 => 3);
Perl использует скобки для создания списка ссылок , который может быть присвоен скаляру.
$a = [ 1, 2, 3 ];
Perl использует фигурные скобки для создания ссылки на хеш , которая может быть присвоена скаляру.
$a = { key1 => 1, key2 => 2 };
Другим важным моментом, который следует иметь в виду, является то, что значения хеш-таблиц всегда являются скалярами. В Perl нет «хэшей списков» «хэшей хэшей» - это условия, которые действительно означают «хэши ссылок на списки » и «хэши ссылок на хеш ».
Имея это в виду, давайте рассмотрим ваши примеры:
%h1 = { ... };
уже неправильно. Скобки создают ссылку на хеш, которая рассматривается как один скаляр, и то, что вы делаете, эквивалентно следующему:
$scalar = { ... };
%h1 = ( "$scalar" => undef );
поэтому %h1
содержит один ключ с уродливым именем, например HASH(0x54321098)
, вместо того, что вы имеете в виду. Вместо этого скажите
%h1 = ( ... )
Двигаемся дальше,
%h1 = (
'key1' => ( 1, 2, 3 ),
'key2' => ( 4, 5, 6 )
);
также не делает то, что выглядит так, как вы хотите. В этом назначении есть списки, а не ссылки на списки, и еще одна вещь, о которой следует помнить, это то, что Perl «выравнивает» списки. Если вы думаете, что =>
просто как причудливый синоним запятой (что почти верно), то вы увидите, что это назначение эквивалентно либо:
%h1 = ( 'key1', 1, 2, 3, 'key2', 4, 5, 6 );
или
%h1 = ( 'key1' => 1,
2 => 3,
'key2' => 4,
5 => 6 );
создание хеш-таблицы с четырьмя парами ключ-значение, а не с двумя ожидаемыми вами.
Если мы исправим скобки вокруг %h2
, то
%h2 = ( key1 => [ 1, 2, 3 ],
key2 => [ 4, 5, 6 ] );
сделает то, что вы ожидаете. Помните, что значения хеш-таблиц должны быть скалярами, а ссылка на список является скаляром. Затем вы можете сказать что-то вроде $h2{'key1'}[1]
, чтобы получить отдельные элементы списка (в данном случае 2).