根据 Perl 中数组的另一个哈希中的值映射哈希键



下面的哈希包含一些节点数据。

%Main_hash%SC_Hash%Cell_Hash

我想使用哈希映射从这些哈希中打印设备(S_<count>) 及其各自的单元格(C_<count>)。

这是我的脚本:

use strict; use warnings;
use Data::Dumper;
my %Main_hash = ( 'Network=Test,Equipment=2' => [ 'A', 'B' ],
'Network=Test,Equipment=3' => [ 'X', 'Y' ],
'Network=Test,Equipment=1' => [ 'D', 'F' ]);
my %SC_Hash = (   'Network=Test,Carrier=3' => 'Network=Test,Equipment=3',
'Network=Test,Carrier=1' => 'Network=Test,Equipment=1',
'Network=Test,Carrier=2' => 'Network=Test,Equipment=2');
my %Cell_Hash = ( 'Network=Test,Cell=34' => [ 'Network=Test,Carrier=1' ],
'Network=Test,Cell=31' => [ 'Network=Test,Carrier=1' ],
'Network=Test,Cell=37' => [ 'Network=Test,Carrier=3' ]);
my $count = 0;
foreach my $equipment (sort keys %Main_hash){
$count++;
print "S_$count=$equipmentn";
my ($k) = grep { $SC_Hash{$_} =~ /$equipment/ } keys %SC_Hash;
print "C_$count=$kn";
}

在这里,我得到这样的输出(电流输出):

S_1=Network=Test,Equipment=1
C_1=Network=Test,Carrier=1
S_2=Network=Test,Equipment=2
C_2=Network=Test,Carrier=2
S_3=Network=Test,Equipment=3
C_3=Network=Test,Carrier=3

但我期待如下输出

S_1=Network=Test,Equipment=1
C_1=Network=Test,Cell=31###Network=Test,Cell=34
S_2=Network=Test,Equipment=2
C_2=NA
S_3=Network=Test,Equipment=3
C_3=Network=Test,Cell=37

如果看到当前输出,则C_1其打印Network=Test,Carrier=1。但它应该在%Cell_Hash中寻找Network=Test,Carrier=1的密钥并打印它的密钥(即Network=Test,Cell=31Network=Test,Cell=34)。

  1. 如果一个特定的载体与多个键匹配%Cell_Hash那么它应该用###分隔来打印,如预期输出中的C_1值所示。
  2. 对于C_2,值是Network=Test,Carrier=2,这在%Cell_Hash的任何数组值中都不存在。这导致哈希中不存在Network=Test,Carrier=2%Cell_Hash密钥。它应按照预期输出中显示的C_2NA打印值。

要获得所需的输出,您可以尝试更改此行:

print "C_$count=$kn";

my $sc_value = get_scvalue( $k );
say "C_$count=$sc_value";

其中get_scvalue()可以定义为:

sub get_scvalue {
my ($k) = @_;
my @values;
for my $ch_key (keys %Cell_Hash) {
my $v = $Cell_Hash{$ch_key};
die "Not array ref!" if ref $v ne "ARRAY";
die "Unexpected array len!" if scalar @$v != 1;
my $vstr = $v->[0];
if ( $vstr eq $k ) {
push @values, $ch_key;
}
}
@values = "NA" if @values == 0;
my $value = join "###", @values;
return $value;
}

最新更新