Đối với mục đích học tập, đây là một hàm đệ quy khá gọn gàng:
sub flatten_hash {
my ($hash, $path) = @_;
$path = [] unless defined $path;
my @ret;
while (my ($key, $value) = each %$hash) {
if (ref $value eq 'HASH') {
push @ret, flatten_hash($value, [ @$path, $key ]);
} else {
push @ret, [ [ @$path, $key ], $value ];
}
}
return @ret;
}
mà phải mất một băm như
{
roman => {
i => 1,
ii => 2,
iii => 3,
},
english => {
one => 1,
two => 2,
three => 3,
},
}
và biến nó thành một danh sách như
(
[ ['roman','i'], 1 ],
[ ['roman', 'ii'], 2 ],
[ ['roman', 'iii'], 3 ],
[ ['english', 'one'], 1 ],
[ ['english', 'two'], 2 ],
[ ['english', 'three'], 3 ]
)
mặc dù tất nhiên t ông ra lệnh bị ràng buộc thay đổi. Với danh sách đó, bạn có thể sắp xếp nó trên { $a->[1] <=> $b->[1] }
hoặc tương tự, sau đó trích xuất đường dẫn khóa từ @{ $entry->[0] }
cho mỗi mục nhập. Nó hoạt động bất kể độ sâu của cấu trúc dữ liệu, và ngay cả khi các nút lá không xảy ra tất cả ở cùng độ sâu. Nó cần một chút mở rộng để đối phó với các cấu trúc không hoàn toàn là hashrefs và scalars đơn giản.
Vì vậy, bạn muốn sắp xếp không quan tâm đến độ sâu trong cấu trúc? – DavidO
Có độ sâu cố định là 3 khóa trong giá trị băm này và tôi muốn sắp xếp giá trị băm theo giá trị của tất cả ba khóa tồn tại. – petranaya