我在perl中有一个哈希,其键是域名,值是对列入黑名单的黑名单区域列表的引用。目前我正在检查4个区域的域名。如果域名在特定区域被列入黑名单我推送数组中的区域名称。
domain1=>(zone1,zone2)
domain2=>(zone1)
domain3=>(zone3,zone4)
domain4=>(zone1,zone2,zone3,zone4)
我想在CGI中用这些值创建一个HTML表,如
domain-names zone1 zone2 zone3 zone4
domain1 true true false false
domain2 true false false false
domain3 false false true true
domain4 true true true true
我尝试使用CGI中的地图
print $q->tbody($q->Tr([
$q->td([
map {
map{
$_
}'$_',@{$result{$_}}
}keys %result
])
)
我无法获得所需的输出。我不确定在地图中使用if-else。 如果我手动生成td'然后我需要为每个条件写一个单独的td,如
If(zone1&&zone2&&!zone3&&!zone4){
print "<td>true</td><td>true</td><td><false/td><td>false</td>";
}
......
这很乏味。我怎么能得到那个输出?
答案 0 :(得分:1)
将你的数组哈希转换为散列哈希。这样可以更轻松地测试特定区域的存在。
以下演示然后在简单的文本表中显示数据:
use strict;
use warnings;
# Your Hash of Arrays
my %HoA = (
domain1 => [qw(zone1 zone2)],
domain2 => [qw(zone1)],
domain3 => [qw(zone3 zone4)],
domain4 => [qw(zone1 zone2 zone3 zone4)],
);
# Convert to a Hash of hashes - for easier testing of existance
my %HoH;
$HoH{$_} = { map { $_ => 1 } @{ $HoA{$_} } } for keys %HoA;
# Format and Zone List
my $fmt = "%-15s %-8s %-8s %-8s %-8s\n";
my @zones = qw(zone1 zone2 zone3 zone4);
printf $fmt, 'domain-names', @zones; # Header
for my $domain ( sort keys %HoH ) {
printf $fmt, $domain, map { $HoH{$domain}{$_} ? 'true' : 'false' } @zones;
}
输出:
domain-names zone1 zone2 zone3 zone4
domain1 true true false false
domain2 true false false false
domain3 false false true true
domain4 true true true true