2010-06-08 42 views
9

Tôi có thể sử dụng IxHash để nhớ thứ tự chèn của một băm.Làm cách nào để giữ lại thứ tự chèn của một hàm băm Perl lồng nhau?

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 

Làm thế nào về hàm băm lồng nhau?

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

Tôi nghi ngờ câu trả lời là không có băm q ẩn danh và đơn đặt hàng bị mất trước khi IxHash nhìn thấy.

Tôi biết rằng tôi có thể thực hiện Tie trên $ hash {q} và sau đó thêm các phần tử, nhưng tôi thích sử dụng lệnh gán duy nhất để tạo băm.

Có mẹo nào không?

Trả lời

11

Có nhiều cách để làm điều này, tôi sẽ chỉ quấn lên cà vạt trong một chương trình con để nó dễ dàng để sử dụng inline:

use Tie::IxHash; 

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

và sau đó:

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

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

các (%) nguyên mẫu trên chương trình con cho perl biết rằng phải mất một danh sách có số nguyên tố là

Các vấn đề liên quan