1

我有散列(%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};
        }
    }
}

我现在能够得到想要的结果。但是有什么紧凑的方法可以实现这一点(因为我在哈希中迭代哈希)。

4

1 回答 1

1

您可以使用地图来缩短您的代码。这是解决方案。

#!/usr/bin/perl

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
);

map {
    $A{$1} = $_ if $_ =~ m/Car=\d+/ && $_ =~ /(.*),Node/
} keys %Hash;

print Dumper(\%A);

map {
    my $ele = $_;
    map {
        my $s_c = $_;
        push @{$Final{$ele}}, $A{$s_c} if $ele =~ m/$s_c.*Device=\d+$/;
    } keys %A;
} keys %Hash;

print "Final:\n".Dumper(\%Final);
于 2021-04-18T22:50:20.703 回答