如何在Perl中打印散列哈希值?

use*_*855 2 perl

我有一个$map{k1}{k2}{k3}{k4}.

如何正确编写循环以打印所有值?以下不起作用.

for my $k1 (sort keys %tripletsCountMap) {
    for my $k2 (sort keys %$tripletsCountMap{k1}){
        for my $k3 (sort keys %$tripletsCountMap{k1}{k2}) {
            for my $k4 (sort keys %$tripletsCountMap{k1}{k3}{k3}){
                print "$k1 $k2 $k3 $k4\n";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sin*_*nür 12

请注意,k1和之间存在差异$k1.

for my $k1 (sort keys %tripletsCountMap) {
    for my $k2 (sort keys %{ $tripletsCountMap{$k1} }){
        for my $k3 (sort keys %{ $tripletsCountMap{$k1}{$k2} }) {
            for my $k4 (sort keys %{ $tripletsCountMap{$k1}{$k2}{$k3} }){
                printf "$k1 $k2 $k3 $k4: $tripletsCountMap{$k1}{$k2}{$k3}{$k4}\n";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的是:

use Data::Dumper;
print Dumper \%tripletsCountMap;
Run Code Online (Sandbox Code Playgroud)

而且,你为什么要对键进行排序?我在下面的评论中理解@ysth的观点.除非有一些显式的输出相关要求,否则我只是不习惯在迭代时对哈希的键进行排序.

  • 除非有巨大的性能影响(通常不是这种情况),循环排序键是一个非常好的主意.它将你从一整类perl版本/平台/数据依赖的bug中解放出来,其中循环体以某种方式依赖于在另一个之前处理的一个密钥. (3认同)
  • 排序(额外工作)以删除可能/从不/支持的可能的用户依赖听起来很愚蠢.如果这是你的逻辑,我建议删除排序. (2认同)