【问题标题】:Altering the Output from Hash Values in Perl在 Perl 中更改哈希值的输出
【发布时间】:2021-06-01 07:39:08
【问题描述】:

我有 2 个哈希值(%hash1%hash2),其中包含某些值。

我想操纵哈希以便以所需的方式打印输出。

这是我的脚本:

#!/usr/bin/perl

use strict; use warnings;

use Data::Dumper;

my %hash1 = (
          'Network=Europe,Node=S02,Sec=1' => [
                                               'Network=Europe,Node=S02,SecAnt=1'
                                             ],
          'Network=Europe,Node=S01,Sec=1' => [
                                               'Network=Europe,Node=S01,SecAnt=1'
                                             ],
          'Network=Europe,Node=S01,Sec=2' => [
                                               'Network=Europe,Node=S01,SecAnt=1'
                                             ]
);
my %hash2 = (
          'Network=Europe,Node=S01,Sec=2' => [
                                               'Network=Europe,Node=S01,Cell=1'
                                             ],
          'Network=Europe,Node=S01,Sec=1' => [
                                               'Network=Europe,Node=S01,Cell=3'
                                             ],
          'Network=Europe,Node=S02,Sec=1' => [
                                               'Network=Europe,Node=S02,Cell=1'
                                             ]
);

my %altered;

foreach my $sec (keys %hash1){
    foreach my $ant (@{$hash1{$sec}}) {
        push @{$altered{$ant}},$hash2{$sec};
    }
}

my $i = 0;

foreach my $sec_ant (sort keys %altered){
    ++$i;
    print "sec_ant_$i:$sec_ant\n";
    foreach my $val (@{$altered{$sec_ant}}){
        foreach my $cell (@$val){
            print "cell_$i:$cell\n"
        }
    }
}

目前的输出:

sec_ant_1:Network=Europe,Node=S01,SecAnt=1
cell_1:Network=Europe,Node=S01,Cell=1
cell_1:Network=Europe,Node=S01,Cell=3
sec_ant_2:Network=Europe,Node=S02,SecAnt=1
cell_2:Network=Europe,Node=S02,Cell=1

预期/期望的输出:

sec_ant_1:Network=Europe,Node=S01,SecAnt=1
cell_1:Network=Europe,Node=S01,Cell=1###Network=Europe,Node=S01,Cell=3
sec_ant_2:Network=Europe,Node=S02,SecAnt=1
cell_2:Network=Europe,Node=S02,Cell=1

如果特定的sec_ant_x 有多个cell_x 值,则应将其与### 分隔符连接。此外,cell_x 值应该是唯一的。我该怎么做?

【问题讨论】:

    标签: perl hash


    【解决方案1】:

    我修改了您创建altered 数据结构的方式;我在存储之前取消引用数组。这简化了检索。

    那么你可以在打印的时候用###join数组的元素:

    my %altered;
    
    foreach my $sec (keys %hash1){
        foreach my $ant (@{$hash1{$sec}}) {
            push @{$altered{$ant}}, @{$hash2{$sec}};
        }
    }
    
    my $i = 0;
    
    foreach my $sec_ant (sort keys %altered){
        ++$i;
        print "sec_ant_$i:$sec_ant\n";
        print "cell_$i:", join('###', @{$altered{$sec_ant}}), "\n";
    }
    

    打印:

    sec_ant_1:Network=Europe,Node=S01,SecAnt=1
    cell_1:Network=Europe,Node=S01,Cell=1###Network=Europe,Node=S01,Cell=3
    sec_ant_2:Network=Europe,Node=S02,SecAnt=1
    cell_2:Network=Europe,Node=S02,Cell=1
    

    【讨论】:

    • 一个小的修正(我没有在我的例子中提到这个场景,很抱歉)。因为我需要唯一的单元格值,所以我使用了模块List::MoreUtilsuniq 函数。打印语句是这样的——print "cell_$i:", join('###', uniq @{$altered{$sec_ant}}), "\n";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多