You might like to use strict; use warnings; with that and fix the syntax first. Note that because you are using hashes the order of the keys is not preserved unless you use tie magic. The following gets close to what you would like to see:
use strict;
use warnings;
my %host =
(
'ip1' =>
{
'tcp' =>
{
'21' =>
{
'state' => 'open',
'service' => 'ftp',
},
'80' =>
{
'state' => 'open',
'service' => 'web',
}
}
},
'ip2' =>
{
'tcp' =>
{
'23' =>
{
'state' => 'open',
'service' => 'telnet',
},
'80' =>
{
'state' => 'open',
'service' => 'web',
}
}
}
);
for (keys %host)
{
my %ip = %{$host{$_}{'tcp'}};
print "$_\n";
for my $port (keys %ip)
{
print " $port " . join ' ', map {$ip{$port}{$_}} keys %{$ip{$por
+t}};
print "\n";
}
}
prints:
ip1
21 ftp open
80 web open
ip2
23 telnet open
80 web open
Perl is Huffman encoded by design.