0

I have a hash in perl whose keys are domain names and value is reference to array of blacklisted zones in which the domain is blacklisted.Currently I am checking the domain against 4 zones.If the domain is blacklisted in the particular zone the I push the zone names in the array.

domain1=>(zone1,zone2)
domain2=>(zone1)
domain3=>(zone3,zone4)
domain4=>(zone1,zone2,zone3,zone4)

I want to create a HTML table from these values in CGI like

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

I tried it using map in CGI like

print $q->tbody($q->Tr([
                           $q->td([
                                   map {
                                         map{
                                             $_
                                            }'$_',@{$result{$_}}
                                       }keys %result
                                  ])         
)

I am unable to the desired output.I am not sure of using if-else in map. If I manually generate the td's Then I need to write a separate td's for each condition like

If(zone1&&zone2&&!zone3&&!zone4){

  print "<td>true</td><td>true</td><td><false/td><td>false</td>";

  }
  ......

It is very tedious.How can I get that output?

1 Answer 1

1

Convert your Hash of Arrays to a Hash of Hashes. This makes it easier to test for existence of a particular zone.

The following demonstrates and then displays the data in a simple text table:

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;
}

Outputs:

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    
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.