下面的哈希包含一些节点数据。
%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=31
和Network=Test,Cell=34
)。
- 如果一个特定的载体与多个键匹配
%Cell_Hash
那么它应该用###
分隔来打印,如预期输出中的C_1
值所示。 - 对于
C_2
,值是Network=Test,Carrier=2
,这在%Cell_Hash
的任何数组值中都不存在。这导致哈希中不存在Network=Test,Carrier=2
%Cell_Hash
密钥。它应按照预期输出中显示的C_2
NA
打印值。
要获得所需的输出,您可以尝试更改此行:
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;
}