为什么 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 ] ;
    }