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{$port}}; print "\n"; } }