Как сохранить порядок вставки вложенного хэша Perl? - PullRequest
9 голосов
/ 09 июня 2010

Я могу использовать IxHash, чтобы запомнить порядок вставки хэша.

use Tie::IxHash;

my %hash;
tie(%hash, 'Tie::IxHash');
%hash = (
  x => 10,
  z => 20,
  q => { a1 => 1, a3 => 5, a2=>2,},
  y => 30,
);

printf("keys %s\n", join(" ", keys %hash));

=> keys x z q y

Как насчет вложенного хеша?

printf("keys %s\n", join(" ", keys %{$hash{q}}));
keys a2 a1 a3

Я подозреваю, что ответ отрицательный, поскольку хеш q анонимный, и заказ теряется до того, как IxHash его увидит.

Я знаю, что могу сделать Tie для $ hash {q}, а затем добавить элементы, но мне нравится использовать одно назначение для построения хэша.

Есть трюк?

1 Ответ

11 голосов
/ 09 июня 2010

Есть несколько способов сделать это, я бы просто завернул галстук в подпрограмму, чтобы его было легко использовать inline:

use Tie::IxHash;

sub ordered_hash (%) {
    tie my %hash => 'Tie::IxHash';
    %hash = @_;
    \%hash
}

и затем:

tie my %hash => 'Tie::IxHash';

%hash = (
    x => 10,
    z => 20,
    q => ordered_hash( a1 => 1, a3 => 5, a2=>2 ),
    y => 30,
);

прототип (%) в подпрограмме сообщает Perl, что он принимает список с четным числом элементов

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