更优雅的访问散列数组的方法

Ste*_*eve 3 arrays perl hash perl-data-structures

首先,如果我在即将发布的帖子中得到任何错误的术语,那么这对我来说仍然是新的.

一些背景,我有一个脚本,检查我们的存档网络配置为一组特定的设置.因此,该脚本会运行许多检查,并将结果添加到该检查的数组中.

例如,确保配置syslog的检查被添加到名为@internalsyslogerror的数组中

运行所有检查后,所有检查的数组都会添加到哈希中,密钥为设备名称.

请注意所有代码都使用严格,使用警告

使用以下命令;

$results{$configs} = [@internalsyslogerror, @bordersyslogerror, 
@borderntperror, @borderntperror, @internalntperror, 
@bordertacacserror, @internaltacacserror, @enablepasswordchecks,
@internalsnmpkeyserror, @timezoneerror, @configregistererror, 
@bannererror, @bootregistererror, @domainnameerror];
Run Code Online (Sandbox Code Playgroud)

我所拥有的问题是提取此信息的最优雅方式,我希望减少为了向脚本添加新检查而必须进行的更改量.目前我将不得不将附加数组添加到上面的代码,然后将解除引用部分添加到处理它的子.

这是我目前所做的去引用和输出数组,然后我通过电子邮件发送.

foreach my $k (keys %results) {
    push @results, "<b>$k</b><br>";
    if (defined $results{$k}[0] ){
    push @results, "$results{$k}[0]";
    }
    if (defined $results{$k}[1] ){
    push @results, "$results{$k}[1]";
    }
    if (defined $results{$k}[2] ){
    push @results, "$results{$k}[2]";
    }
    if (defined $results{$k}[3] ){  
    push @results, "$results{$k}[3]";
    }
    if (defined $results{$k}[4] ){
    push @results, "$results{$k}[4]";
    }
    if (defined $results{$k}[5] ){
    push @results, "$results{$k}[5]";
    }
    if (defined $results{$k}[6] ){
    push @results, "$results{$k}[6]";
    }
    if (defined $results{$k}[7] ){
    push @results, "$results{$k}[7]";
    }
    if (defined $results{$k}[8] ){
    push @results, "$results{$k}[8]";
    }
    if (defined $results{$k}[9] ){
    push @results, "$results{$k}[9]";
    }
    if (defined $results{$k}[10] ){
    push @results, "$results{$k}[10]";
    }
    if (defined $results{$k}[11] ){
    push @results, "$results{$k}[11]";
    }
    if (defined $results{$k}[12] ){
    push @results, "$results{$k}[12]";
    }
    if (defined $results{$k}[13] ){
    push @results, "$results{$k}[13]";
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,我可以做我上面做的事情,但不知何故"动态"生成代码

谢谢

hex*_*der 5

foreach my $k (keys %results) { 
   push @results, "<b>$k</b><br>"; 
   for my $result (@{$results{$k}) {
       next if (!defined $result);
       push @results, $result;
   }
}
Run Code Online (Sandbox Code Playgroud)

甚至

foreach my $k (keys %results) { 
   push @results, "<b>$k</b><br>"; 
   push @results, grep { defined $_ } @{$results{$k}};
}
Run Code Online (Sandbox Code Playgroud)

编辑:在最后一次推送中修正了错误...