in reply to Re: Parsing output from Nmap::Scanner with varying hash address.
in thread Parsing output from Nmap::Scanner with varying hash address.

For starters, I'd like to produce a simpler hash with a few key elements. Something like the following;

( 'smtp' => 'closed', 'http' => 'open', 'https' => 'open', )

Right now I have the following and I'd like a more elegant/cleaner solution, if possible.

my %shortlist; for my $key (keys $results->{'ALLHOSTS'}){ for my $key2 (keys $results->{'ALLHOSTS'}{$key}->{'ports'}->{' +tcp'}){ $shortlist{"$results->{'ALLHOSTS'}{$key}->{'ports'}->{'tcp +'}->{$key2}->{'service'}->{'name'}"} = $results->{'ALLHOSTS'}{$key}-> +{'ports'}->{'tcp'}->{$key2}->{'state'}; } }

Replies are listed 'Best First'.
Re^3: Parsing output from Nmap::Scanner with varying hash address.
by Laurent_R (Canon) on Jul 11, 2015 at 09:54 UTC
    I do not know if this is cleaner or more elegant, but you could remove most of these -> dereferencing arrows (those between closing and opening curly braces), thereby making the syntax at least a bit shorter.

    Something like this should probably work (but is untested):

    my %shortlist; for my $key (keys $results->{'ALLHOSTS'}){ for my $key2 (keys $results->{'ALLHOSTS'}{$key}{'ports'}{'tcp'}){ $shortlist{"$results->{'ALLHOSTS'}{$key}{'ports'}{'tcp'}{$key2 +}{'service'}{'name'}"} = $results->{'ALLHOSTS'}{$key}{'ports'}{'tcp'} +{$key2}{'state'}; } }

      Removing most of the '->'s is a good idea. You could also remove 26 single-quotes (around all the literal key names) and a pair of double-quotes. Splitting the assignment over two lines gives a maximum line length of 80 characters (previously 156). I think that provides additional readability.

      my %shortlist; for my $key (keys $results->{ALLHOSTS}) { for my $key2 (keys $results->{ALLHOSTS}{$key}{ports}{tcp}) { $shortlist{$results->{ALLHOSTS}{$key}{ports}{tcp}{$key2}{servi +ce}{name}} = $results->{ALLHOSTS}{$key}{ports}{tcp}{$key2}{state}; } }

      [Note: as I'm editing untested code, mine is also untested.]

      Update: I've also added spaces before the opening braces of the for blocks: I think that makes those a little clearer.

      -- Ken

        Yeah, right, Ken, I did not think about it, but yes, removing the useless quote marks is also making the syntax much shorter (and cleaner in my view). ++.