如果您知道您将需要哪些物品以及您需要它们的顺序
对于键,然后重新解析键的价值值得怀疑。我更喜欢存储
他们在水平。
$hash{ $h->{name} }{ $h->{date} } = $h;
# ... OR ...
$hash{ $h->{date} }{ $h->{name} } = $h;
foreach my $name ( sort keys %hash ) {
my $name_hash = $hash{$name};
foreach my $date ( keys %$name_hash ) {
print "\$hash{$name}{$date} => " . Dumper( $name_hash->{$date} ) . "\n";
}
}
对于任意级别,您可能需要一个遍历函数
sub traverse_hash (&@) {
my ( $block, $hash_ref, $path ) = @_;
$path = [] unless $path;
my ( @res, @results );
my $want = wantarray;
my $want_something = defined $want;
foreach my $key ( %$hash_ref ) {
my $l_path = [ @$path, $key ];
my $value = $hash_ref->{$key};
if ( ref( $value ) eq 'HASH' ) {
@res = traverse_hash( $block, $value, $l_path );
push @results, @res if $want_something && @res;
}
elsif ( $want_something ) {
@res = $block->( $l_path, $value );
push @results, @res if @res;
}
else {
$block->( $path, $value );
}
}
return unless $want_something;
return $want ? @results : { @results };
}
所以这和上面做的一样:
traverse_hash {
my ( $key_path, $value ) = @_;
print( '$hash{' . join( '}{', @$key_path ) . '} => ' . ref Dumper( $value ));
();
} \%hash
;