Perl多级哈希遍历问题咨询:如何正确打印内层哈希键值对
解决方法
错误原因
- 第一版遍历输出
HASH(XXXXXX):因为$switchportinfo{$key}->{$ele}存储的是CSV行数据的哈希引用,直接打印引用只会输出内存地址,需要解引用后遍历内部的键值对。 - 第三版代码报错:内层遍历的
keys %{switchportinfo{$key}{$ele}}存在语法错误,访问哈希%switchportinfo的嵌套元素时缺失了变量前缀$,Perl会将其识别为哈希切片而非哈希引用,不符合keys函数的参数要求。
正确遍历代码
基础修正版
for my $key (keys %switchportinfo) { print "$key: \n"; for my $ele (keys %{$switchportinfo{$key}}) { print " $ele: \n"; # 仅补充缺失的$符号即可修复报错 for my $ele2 (keys %{$switchportinfo{$key}{$ele}}) { print " $ele2: " . $switchportinfo{$key}{$ele}->{$ele2}. "\n"; } } }
可读性优化版
可以将每层的哈希引用提前赋值给临时变量,降低嵌套语法的出错概率:
for my $switch_name (keys %switchportinfo) { print "$switch_name:\n"; my $ports_ref = $switchportinfo{$switch_name}; for my $port (keys %$ports_ref) { print " $port:\n"; my $port_attrs = $ports_ref->{$port}; for my $attr_name (keys %$port_attrs) { print " $attr_name: $port_attrs->{$attr_name}\n"; } } }
内容的提问来源于stack exchange,提问作者crokett
相关产品推荐
相关产品推荐

