【问题标题】:Map a hash key based on value in another hash of array in Perl根据 Perl 中另一个数组散列中的值映射散列键
【发布时间】:2021-02-04 17:02:24
【问题描述】:

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

%Main_hash%SC_Hash%Cell_Hash

我想使用哈希映射从这些哈希中打印 Equipment(S_<count>) 及其各自的 Cells(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=$equipment\n";
    my ($k) = grep { $SC_Hash{$_} =~ /$equipment/ } keys %SC_Hash;
    print "C_$count=$k\n";
}

我在这里得到这样的输出(当前输出):

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_2 中将值打印为NA,如预期输出所示。

【问题讨论】:

  • 这与您的earlier question 相同。您需要按设备分组的单元格,因此请创建该单元格
  • @ikegami 是的,但是关系很简单,这里我还有 2 个哈希来获取关系。
  • 啊,你试过了吗?你在哪里尝试过? /// 但是不,它并没有真正变得更复杂。事实上,它几乎是相同的。你真的只需要按运营商分组的单元格,这正是前面问题所回答的。您已经可以轻松查找运营商的设备了。
  • @ikegami 我可以用当前输出中显示的载体映射设备。但是从载体到细胞对我来说似乎很复杂,因为它在数组的散列中:|
  • 你之前的问题也是一个 AoH。

标签: perl hashmap


【解决方案1】:

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

print "C_$count=$k\n";

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

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 2011-05-08
    • 2014-11-07
    • 2011-02-03
    • 2014-05-19
    • 1970-01-01
    • 2023-03-24
    • 2015-09-18
    相关资源
    最近更新 更多