在 Perl 中更改哈希值的输出
Altering the Output from Hash Values in Perl
我有 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
Expected/Desired 输出:
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
值应该是唯一的。我该怎么做?
我修改了您创建 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
我有 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
Expected/Desired 输出:
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
值应该是唯一的。我该怎么做?
我修改了您创建 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