Вы хотите
my %hash = (key1 => 'value1', key2 => 'value2'); # Hash
или
my $hash = { key1 => 'value1', key2 => 'value2' }; # Reference to hash
Когда один задает список на хэш, он рассматривается как список пар ключ-значение, поэтому правильный способ инициализация хеша составляет
my %hash = (key1 => 'value1', key2 => 'value2');
{ ... }
похож на
do { my %anon = (...); \%anon }
Это создает анонимный хеш и возвращает ссылку на него. Единый справочник не является список пар ключ-значение, так что следующее не имеет смысла:
my %hash = { ... }; # XXX
Если вы действительно хотели сохранить ссылку на хэш, вы бы хранить его в скаляр.
my $hash = { ... }; # ok
Так что же следующее делать?
my $hash = (a => 'b', c => 'd');
Ну
a => 'b', c => 'd'
просто причудливый способ написания
'a', 'b', 'c', 'd'
И поскольку мы присваиваем в скаляр, то правая часть оператора присваивания оценивается в скалярном контексте. Список буквальный (например 'a', 'b', 'c', 'd'
) в скалярном контексте оценивает в своем последнем пункте, таким образом
my $hash = (a => 'b', c => 'd');
означает
my $hash = 'd';
'использовать строгие; использовать предупреждения; ' – friedo