首先,如果我在即将发布的帖子中出现任何术语错误,请表示歉意,这对我来说仍然很新。
一些背景知识,我有一个脚本可以检查我们存档的网络配置中的一组特定设置。因此,该脚本运行许多检查,并将结果添加到该检查的数组中。
例如 确保 syslog 已配置的检查被添加到名为 @internalsyslogerror 的数组中
运行所有检查后,所有检查的数组都会添加到哈希中,键是设备名称。
注意所有代码都使用严格,使用警告
使用以下命令;
$results{$configs} = [@internalsyslogerror, @bordersyslogerror,
@borderntperror, @borderntperror, @internalntperror,
@bordertacacserror, @internaltacacserror, @enablepasswordchecks,
@internalsnmpkeyserror, @timezoneerror, @configregistererror,
@bannererror, @bootregistererror, @domainnameerror];
我遇到的问题是提取此信息的最优雅的方法是什么,我想减少为了向脚本添加新检查而必须进行的更改量。 目前,我必须将附加数组添加到上面的代码中,然后将取消引用部分添加到处理它的子程序中。
目前,我正在执行取消引用并将其输出到数组的操作,然后通过电子邮件发送该数组。
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]";
}
}
问题是,我可以做上面做的事情,但以某种方式“即时”生成代码
谢谢
最佳答案
foreach my $k (keys %results) {
push @results, "<b>$k</b><br>";
for my $result (@{$results{$k}) {
next if (!defined $result);
push @results, $result;
}
}
甚至
foreach my $k (keys %results) {
push @results, "<b>$k</b><br>";
push @results, grep { defined $_ } @{$results{$k}};
}
编辑:修复了上次推送中的拼写错误...
关于arrays - 访问散列数组的更优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6423605/