Я могу использовать 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 видит его.
Я знаю, что могу сделать, Привязывают $hash {q} и затем добавляют элементы, но мне нравится использовать однократное присвоение для создания хеша.
Существует ли прием?
Есть несколько способов сделать это, я бы просто завернул связку в подпрограмму, чтобы ее было легко использовать 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, что она принимает список с четным количеством элементов