使用perl创建Html表

时间:2014-08-30 18:40:20

标签: html perl cgi

我在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>";

  }
  ......

这很乏味。我怎么能得到那个输出?

1 个答案:

答案 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