Когда вы пишете:
my %hash = @array;
Что видит Perl:
my %hash = ($array[0], $array[1], ... $array[$#array]);
Таким образом, @array
разворачивается в список, и этот список присваивается множественному числу %hash
. В списке должно быть четное количество элементов, иначе вы получите предупреждение (при условии, что вы используете use warnings;
в своем скрипте, что всегда должно быть. use strict;
).
Разбит еще больше, это:
my %hash;
$hash{$array[0]} = $array[1];
$hash{$array[2]} = $array[3];
...
$hash{$array[$#array - 1]} = $array[$#array];
Итак, объяснив перевод с @array
на %hash
, вставьте этот хэш в хэш хешей для определенного ключа:
$HoH{key} = \%hash;
Где символ \
принимает ссылку на %hash
. Если %hash
не нужен где-то еще, вы можете ограничить его блоком:
{
my %hash = @array;
$HoH{key} = \%hash;
}
Использование do {...}
делает его немного короче:
$HoH{key} = do {my %hash = @array; \%hash};
Но не намного короче. Если вышесказанное кажется вам утомительным, оно должно быть. В Perl вышеупомянутая конструкция может быть уменьшена до:
$HoH{key} = { @array };
Где {...}
обозначает анонимный хеш-конструктор, эквивалентный
do {my %hash = (...); \%hash}
В дополнение к {...}
Perl предоставляет конструкцию [...]
для создания анонимных ссылок на массивы. ...
обеих конструкций видит контекст списка.