为什么 HoA 在打印结果时有括号
Why HoA has parenthesis while printing the result
我写了一个脚本,可以解析文件并在屏幕上打印数据。
#!/usr/bin/perl
use Data::Dumper;
use List::Util qw /uniq/;
while (my $line = <DATA>){
chomp $line;
next if $line =~ /^#/;
if ($line =~ m/^\s*Node :\s*(.*?)\s*$/) {
$node = ;
} elsif ($line =~ m/^\s*DeviceReference :\s*(.*)\s*$/) {
$Hash1{$node} = [ split /, /, ] ;
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
$Hash2{$node} = [ split /, /, ] ;
}
}
foreach my $Sec (keys %Hash1){
($until_sec = $Sec) =~ s/,Car=\d+//;
if (exists $Hash2{$until_sec}){
foreach my $Group (@{$Hash1{$Sec}}){
$Group =~ s/\[|\]//;
$Group =~ s/,DeviceSet=\d+,Device=\d+//;
push @{$Final{$Group}}, @{$Hash2{$until_sec}};
}
}
}
foreach my $Group (sort keys %Final){
++$i;
print "-Group_$i=$Group\n";
print "-Ant_$i=", join('###', uniq @{$Final{$Group}}), "\n";
}
__DATA__
Node : Network=12,Node=1,Sec=1,Car=1
DeviceReference : [Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R,DeviceSet=1,Device=1, Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R,DeviceSet=1,Device=2]
Node : Network=12,Node=1,Sec=1
AntRef : [Network=12,Equ=1,Ant=1-1]
当前结果:
-Group_1=Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R
-Ant_1=[Network=12,Equ=1,Ant=1-1]
预期结果:
-Group_1=Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R
-Ant_1=Network=12,Equ=1,Ant=1-1
问题:为什么-Ant_1
值字段中有一个方括号([..]
)? push
将数据输入 HoA 时我做错了什么吗?
您从组中删除了 []
,但没有从 %Hash2
的值中删除。
要删除方括号,您可以使用
push @{ $Final{$Group} }, map s/[\]\[]//gr, @{ $Hash2{$until_sec} };
/r
修饰符需要 Perl 5.14+。在旧版本中,使用
push @{ $Final{$Group} },
map { (my $x = $_) =~ s/[\]\[]//g; $x }
@{ $Hash2{$until_sec} };
方括号已在您的输入数据中。除非您删除它们,否则它们会被带到输出中。
您可以将第一个循环中的最后一个 elif
更改为此以删除任何方括号:
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
my $ant = ;
$ant =~ s/[\[\]]//g;
$Hash2{$node} = [ split /, /, $ant ] ;
}
不确定这是否是您想要的,或者您是否更愿意仅在第一个和最后一个位置删除它们:
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
my $ant = ;
$ant =~ s/^\[//;
$ant =~ s/\]$//;
$Hash2{$node} = [ split /, /, $ant ] ;
}
我写了一个脚本,可以解析文件并在屏幕上打印数据。
#!/usr/bin/perl
use Data::Dumper;
use List::Util qw /uniq/;
while (my $line = <DATA>){
chomp $line;
next if $line =~ /^#/;
if ($line =~ m/^\s*Node :\s*(.*?)\s*$/) {
$node = ;
} elsif ($line =~ m/^\s*DeviceReference :\s*(.*)\s*$/) {
$Hash1{$node} = [ split /, /, ] ;
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
$Hash2{$node} = [ split /, /, ] ;
}
}
foreach my $Sec (keys %Hash1){
($until_sec = $Sec) =~ s/,Car=\d+//;
if (exists $Hash2{$until_sec}){
foreach my $Group (@{$Hash1{$Sec}}){
$Group =~ s/\[|\]//;
$Group =~ s/,DeviceSet=\d+,Device=\d+//;
push @{$Final{$Group}}, @{$Hash2{$until_sec}};
}
}
}
foreach my $Group (sort keys %Final){
++$i;
print "-Group_$i=$Group\n";
print "-Ant_$i=", join('###', uniq @{$Final{$Group}}), "\n";
}
__DATA__
Node : Network=12,Node=1,Sec=1,Car=1
DeviceReference : [Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R,DeviceSet=1,Device=1, Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R,DeviceSet=1,Device=2]
Node : Network=12,Node=1,Sec=1
AntRef : [Network=12,Equ=1,Ant=1-1]
当前结果:
-Group_1=Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R
-Ant_1=[Network=12,Equ=1,Ant=1-1]
预期结果:
-Group_1=Network=12,Equ=1,Rack=1,Slot=3,Unit=R-1,Group=R
-Ant_1=Network=12,Equ=1,Ant=1-1
问题:为什么-Ant_1
值字段中有一个方括号([..]
)? push
将数据输入 HoA 时我做错了什么吗?
您从组中删除了 []
,但没有从 %Hash2
的值中删除。
要删除方括号,您可以使用
push @{ $Final{$Group} }, map s/[\]\[]//gr, @{ $Hash2{$until_sec} };
/r
修饰符需要 Perl 5.14+。在旧版本中,使用
push @{ $Final{$Group} },
map { (my $x = $_) =~ s/[\]\[]//g; $x }
@{ $Hash2{$until_sec} };
方括号已在您的输入数据中。除非您删除它们,否则它们会被带到输出中。
您可以将第一个循环中的最后一个 elif
更改为此以删除任何方括号:
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
my $ant = ;
$ant =~ s/[\[\]]//g;
$Hash2{$node} = [ split /, /, $ant ] ;
}
不确定这是否是您想要的,或者您是否更愿意仅在第一个和最后一个位置删除它们:
} elsif ($line =~ m/^\s*AntRef :\s*(.*)\s*$/) {
my $ant = ;
$ant =~ s/^\[//;
$ant =~ s/\]$//;
$Hash2{$node} = [ split /, /, $ant ] ;
}