Nếu bạn đang làm việc với các dữ liệu cây đi hơn hai cấp độ sâu, và bạn thấy mình muốn đi cây, trước tiên bạn nên xem xét mà bạn sẽ kiếm được nhiều của công việc phụ cho chính mình nếu bạn có kế hoạch reimplementing tất cả mọi thứ bạn cần phải làm bằng tay trên băm băm của băm khi có rất nhiều lựa chọn thay thế tốt có sẵn (search CPAN for "Tree").
Không biết yêu cầu dữ liệu của bạn thực sự là gì, tôi sẽ hướng dẫn bạn một cách mù quáng tại tutorial for Tree::DAG_Node để giúp bạn bắt đầu.
Điều đó nói rằng, Axeman là chính xác, một hashwalk được thực hiện dễ dàng nhất với đệ quy. Dưới đây là một ví dụ để giúp bạn bắt đầu nếu bạn cảm thấy bạn hoàn toàn phải giải quyết vấn đề của bạn với băm băm băm:
#!/usr/bin/perl
use strict;
use warnings;
my %hash = (
"toplevel-1" =>
{
"sublevel1a" => "value-1a",
"sublevel1b" => "value-1b"
},
"toplevel-2" =>
{
"sublevel1c" =>
{
"value-1c.1" => "replacement-1c.1",
"value-1c.2" => "replacement-1c.2"
},
"sublevel1d" => "value-1d"
}
);
hashwalk(\%hash);
sub hashwalk
{
my ($element) = @_;
if(ref($element) =~ /HASH/)
{
foreach my $key (keys %$element)
{
print $key," => \n";
hashwalk($$element{$key});
}
}
else
{
print $element,"\n";
}
}
Nó sẽ ra:
toplevel-2 =>
sublevel1d =>
value-1d
sublevel1c =>
value-1c.2 =>
replacement-1c.2
value-1c.1 =>
replacement-1c.1
toplevel-1 =>
sublevel1a =>
value-1a
sublevel1b =>
value-1b
Lưu ý rằng bạn KHÔNG THỂ dự đoán theo thứ tự nào các phần tử băm sẽ được vượt qua trừ khi bạn gắn băm thông qua Tie :: IxHash hoặc tương tự - một lần nữa, nếu bạn định trải qua nhiều công việc, tôi khuyên bạn nên sử dụng một mô-đun cây.
Ngữ cảnh danh sách sẽ không trả lại danh sách được phân đoạn, mà là danh sách được làm phẳng, vì vậy bạn sẽ không nhận được hai lần quay trở lại cùng một lúc. Tốt hơn là deep_keys chuyển trở lại tham chiếu mảng. – Axeman