Perl遍历哈希数组匹配字段值的方法及代码错误排查
Perl哈希数组遍历匹配代码异常排查
问题场景
现有如下存储接口映射关系的数组引用,每个元素是包含接口名(VALUE)、接口索引(ASN1)的哈希:
ifNameList -> $VAR1 = [ { 'VALUE' => ' gpon_olt-1/1/1', 'ASN1' => '285278465' }, { 'VALUE' => ' gpon_olt-1/1/2', 'ASN1' => '285278466' }, { 'VALUE' => ' gpon_olt-1/1/3', 'ASN1' => '285278467' }, { 'VALUE' => ' gpon_olt-1/1/4', 'ASN1' => '285278468' }, { 'VALUE' => ' gpon_olt-1/1/5', 'ASN1' => '285278469' }, ]
需求为遍历该结构,比对每个哈希的VALUE字段(需先去除首尾空白),匹配指定接口名后返回对应的ASN1索引值。编写的如下代码无法正常运行:
sub GetIfIndexFromName{ my $ifName = shift; my @ifList = shift; my $index; for (@ifList){ my %interfaceHash = %$_; # Just trims any blank space on the string: $interfaceHash->{"VALUE"} =~ s/^\s+|\s+$//g; if($interfaceHash->{"VALUE"} eq $ifName){ print "trimmed interface name-> ".$interfaceHash->{"VALUE"}."\n\n"; $index = $interfaceHash->{"ASN1"}; } } print "Returning index value: ".$index; return $index; }
代码存在的核心问题
- 参数接收逻辑错误:Perl子函数的所有入参都存放在内置数组
@_中,传入的第二个参数是数组引用(标量类型),用数组@ifList去接shift出来的标量引用,会导致@ifList里只有一个引用值,后续遍历根本拿不到里面的哈希元素,逻辑从第一步就失效。 - 哈希与哈希引用用法混淆:循环中
my %interfaceHash = %$_;是把当前元素(哈希引用)解引用复制为一个普通哈希,但后续用$interfaceHash->{KEY}的哈希引用语法去访问普通哈希,会直接触发运行报错。 - 遍历无终止逻辑:就算前面的逻辑正确,找到匹配项后没有跳出循环,会继续遍历后续所有元素,若存在重名项会覆盖已经拿到的正确索引,也存在不必要的性能损耗。
修正后可运行代码
sub GetIfIndexFromName{ # 批量接收两个入参:待匹配接口名、接口数组引用 my ($ifName, $ifListRef) = @_; # 直接解引用数组遍历,无需额外复制哈希结构 for my $interface (@$ifListRef){ # 去除接口名字段首尾空白 $interface->{VALUE} =~ s/^\s+|\s+$//g; if($interface->{VALUE} eq $ifName){ print "trimmed interface name-> ".$interface->{VALUE}."\n\n"; print "Returning index value: ".$interface->{ASN1}; # 找到匹配项直接返回,终止遍历 return $interface->{ASN1}; } } # 无匹配项时按需返回undef即可 return undef; } # 调用示例:第二个参数直接传入数组引用 # my $ifIndex = GetIfIndexFromName('gpon_olt-1/1/3', $VAR1);
内容的提问来源于stack exchange,提问作者ExploitZ
相关产品推荐
相关产品推荐

