我有散列(%Hash
)中的元素列表。
我需要相互比较关键元素,如果一个键与另一个键匹配(在某些条件下),那么它将成为一对并且应该将其存储在 HOA 中。
这是我的脚本:
use strict; use warnings;
use Data::Dumper;
my (%A, %Final);
my %Hash = (
'Network=ROOT,Network=R16,Me=4462,Element=1,Node=1,Sec=1,Car=3' => 1,
'Network=ROOT,Network=R16,Me=4462,Element=1,Equipment=1,Rack=1,Slot=1,Unit=1,DeviceSet=1,Device=1' => 1
);
foreach my $car (keys %Hash){
if($car =~ m/Car=\d+/){
if($car =~ /(.*),Node/){
$A{$1} = $car;
}
}
}
print Dumper(\%A);
foreach (keys %Hash){
if($_ =~ m/$A{$_}(.*)(Device=\d+)$/){
push @{$Final{$_}}, $A{$_};
}
}
print "Final:\n".Dumper(\%Final);
比方说,如果任何元素包含,Network=ROOT,Network=R16,Me=4462,Element=1
那么如果任何其他元素包含上述数据以及键以结尾,Device=\d+
那么两者都应该成为键和值数组。
当前结果:
$VAR1 = {
'Network=ROOT,Network=R16,Me=4462,Element=1,Equipment=1,Rack=1,Slot=1,Unit=1,DeviceSet=1,Device=1' => [
undef
]
};
预期结果:
$VAR1 = {
'Network=ROOT,Network=R16,Me=4462,Element=1,Equipment=1,Rack=1,Slot=1,Unit=1,DeviceSet=1,Device=1' => [
Network=ROOT,Network=R16,Me=4462,Element=1,Node=1,Sec=1,Car=3
]
};
为什么我undef
在 HOA 中获得价值。
更新: 我已经更新了代码,在第二次哈希迭代中,代码如下所示:
foreach my $ele (keys %Hash){
foreach my $s_c(keys %A){
if($ele =~ m/$s_c(.*)(Device=\d+)$/){
push @{$Final{$ele}}, $A{$s_c};
}
}
}
我现在能够得到想要的结果。但是有什么紧凑的方法可以实现这一点(因为我在哈希中迭代哈希)。