Поместите массив в хэш хэшей, превратив его в сам хэш - PullRequest
0 голосов
/ 27 марта 2011
my %hash = @array;

превращает массив в хеш, но как можно сделать то же самое с $ hash {что-то} ?

Ответы [ 2 ]

6 голосов
/ 27 марта 2011
$hash{something} = { @array };

* * * * * * * * * * * * * *

вокруг него создает хэш-ссылку. *1003*
5 голосов
/ 28 марта 2011

Когда вы пишете:

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 предоставляет конструкцию [...] для создания анонимных ссылок на массивы. ... обеих конструкций видит контекст списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...