繁体   English   中英

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

[英]How can I print a hash of hashes of hashes in 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";
            }
        }
    }
}

请注意, 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";
            }
        }
    }
}

更好的是:

use Data::Dumper;
print Dumper \%tripletsCountMap;

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

如果这是出于调试或类似目的,最好使用Data::Dumper来执行此类操作。 它足够智能,可以跟踪数据结构并使其正确。

当使用%来取消引用表达式时,表达式必须包含在{}中,除非它是一个简单的标量(例如%$href )。

我建议你阅读http://perlmonks.org/?node=References+quick+reference

穷人的翻车机:

sub trace {
    my ( $val, $path ) = @_;
    my $ref = ref $val;
    if ( $ref eq '' ) {
        print "$path = $val\n";
    }
    elsif ( $ref eq 'HASH' ) {
        trace( $val->{$_}, $path . "{$_}" ) for keys %$val;
    }
    elsif ( $ref eq 'ARRAY' ) {
        trace( $val->[$_], $path . "[$_]" ) for 0 .. $#$val;
    }
    else {
        warn "I don't know what to do with $ref at $path\n";
    }
}

trace($map, '$map->');

$ k1是变量,k1是一个裸字

perl -e '%h = (1 => 2, "k1" => 3); $k1 = 1; printf "%d %d\n", $h{$k1}, $h{k1}'

2 3

然后,如果使用哈希引用,请谨慎使用标量变量来存储它们。

perl -e '$h = {1 => 2, "k1" => 3}; $k1 = 1; printf "%d %d\n", $h->{$k1}, $h->{k1}'

2 3

如果你碰巧写了什么东西会按预期工作:

perl -e '%h = {1 => 2, "k1" => 3}; $k1 = 1; printf "%d %d\n", $h->{$k1}, $h->{k1}'

0 0

如果裸字不是问题(可能是),那么你应该仔细检查你是如何构建你的地图的。

你可以使用以下代码:这将工作

while(my($key1,$value1)=each(%hash_hash)){
  while(my($key2,$value2)=each(%$value1)){
       print $key1."=".$key2."=".$value2."\n";
  }

}

您正在打印所有键但不是最终值。

在最内层的循环中添加:


my $val = $map{$k1}{$k2}{$k3}{$k4};
print "$val\n"; 

另一种方式:

 while (my ($first,$second) = each (%hash_hash_hash_hash)) {
    while (my ($second, $third) = each (%$second)) {
        while (my ($third, $fourth) = each (%$third)) {
            while (my ($fourth, $value) = each (%$fourth)) {
                print "$first\t$second\t$third\t$fourth\t$value\n";
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM