如果你知道需要哪些项,以及它们在键中的顺序,那么重新解析键的价值是有问题的。我更喜欢按级别存储。
$hash{ $h->{name} }{ $h->{date} } = $h;
$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
;