http://www.perlmonks.org?node_id=863189

k_grdn has asked for the wisdom of the Perl Monks concerning the following question:

Great Monks,

Hit a wall extracting data from a hash of arrays.

while(<>) { chomp; if ( /set\spolicy\sid\s(\d+)\s(from|name\s\"[^"]+\")?\sfrom/ ) { $ +id = $1; push ( @{ $id_policy{$id}}, $_ ); next; } push ( @{$id_policy{$id}}, $_ ) if $id } for my $id ( keys %id_policy ) { foreach (@{ $id_policy{$id} }) { if ( /set\spolicy\sid\s(\d+)\s(from|name\s\"[^"]+\"\sfrom)\s\" +Untrust\"\sto\s"DMZ/ ) { # ????????? } } }

input set policy id 155 from "Trust" to "Untrust" "**** Users" "Safe Boot S +ervers" "ANY" nat src permit set policy id 155 exit set policy id 150 from "DMZ" to "Untrust" "**** Zone1" "Postini" "SMT +P" nat src permit log set policy id 150 set src-address "**** Zone2" set src-address "***** Farm Servers" set src-address "**** Zones" set log session-init exit set policy id 154 from "Trust" to "DMZ" "*** - **** DB" "****" "Oracl +e - 1521" permit set policy id 154 exit set policy id 157 from "Untrust" to "Trust" "Postini" "MIP(194.82.*** +.***)" "SMTP" permit set policy id 157 exit set policy id 162 from "DMZ" to "Trust" "*****" "****_DEV Database se +rver" "HTTP" permit set policy id 162 exit set policy id 163 name "mail-relay.**** => OUTBOUND" from "Trust" to " +Untrust" "Mail-Relay" "Postini" "SMTP" nat src dip-id 5 permit set policy id 163 exit

I would like to output the entire array for the match Untrust to DMZ.

set policy id 148 from "Untrust" to "DMZ" "Any" "MIP(194.82.***.180)" + "HTTP" permit set policy id 148 application "HTTP" set policy id 148 exit

Thanks,

k_grdn

Replies are listed 'Best First'.
Re: Dereference Hash of Arrays
by halfcountplus (Hermit) on Oct 03, 2010 at 17:28 UTC

    It would be nice if you:

    1. Indented properly.
    2. More significantly (this is a "teach a person to fish" principle): learn a basic premise of debugging/programming problem-solving whereby you come up with simple demos for a step you are not sure of. Eg, if you are uncertain about "hash of array" syntax in a specific case, write a standalone script using a similar data structure, but uncomplicated by extraneous elements such as the use of regexps. This way, you can separate your data structure management from your use of regexps and determine where your challenge/problem lies.

    >>I would like to output the entire array for the match Untrust to DMZ.

    So you have a hash of sections based on the id number after "set policy id ". That being the case, what's wrong with:

    for my $id ( keys %id_policy ) { foreach (@{ $id_policy{$id} }) { if ( /set\spolicy\sid\s(\d+)\s(from|name\s\"[^"]+\"\sfrom)\s\" +Untrust\"\sto\s"DMZ/ ) { foreach my $line (@{$id_policy{$id}}) { print $line } } }
    }
        Thank you very much for your reply, sure I tried that but as suggested stripping back the code would have been the best method for a self explanatory result.

        Thanks Again