in reply to Setting up conditional check for printing out keys from array/hash ref

There are a large number of ways to solve this problem and the best solutions probably involve recursion to deal with nested directories. However, you haven't asked for such a solution (yet) so here's a solution that uses Perl 5.10 (and later)'s switch statement:

use strict; use warnings; use 5.010; my $lsResults1 = { 'recursive' => 'no', 'version' => '0.20.202.1.1101050227', 'time' => '2011-10-26T00:21:06+0000', 'filter' => '.*', 'path' => '/work/eng/feeds/customer_care', 'directory' => [ { 'owner' => 'tst_act', 'group' => 'eng', 'permission' => 'drwxr-xr-x', 'path' => '/work/eng/feeds/customer_care', 'accesstime' => '1970-01-01T00:00:00+0000', 'modified' => '2011-10-25T23:54:17+0000' }, { 'owner' => 'tst_act', 'group' => 'eng', 'permission' => 'drwx------', 'path' => '/work/eng/feeds/customer_care/abc', 'accesstime' => '1970-01-01T00:00:00+0000', 'modified' => '2011-10-25T17:12:56+0000' }, { 'owner' => 'tst_act', 'group' => 'eng', 'permission' => 'drwx------', 'path' => '/work/eng/feeds/customer_care/def', 'accesstime' => '1970-01-01T00:00:00+0000', 'modified' => '2011-10-25T21:05:50+0000' }, { 'owner' => 'tst_act', 'group' => 'eng', 'permission' => 'drwx------', 'path' => '/work/eng/feeds/customer_care/test', 'accesstime' => '1970-01-01T00:00:00+0000', 'modified' => '2011-10-25T21:28:14+0000' } ], 'exclude' => '' }; my $lsResults2 = { 'recursive' => 'no', 'version' => '0.20.202.1.1101050227', 'time' => '2011-10-26T00:30:02+0000', 'filter' => '.*', 'file' => { 'owner' => 'tst_act', 'replication' => '3', 'blocksize' => '134217728', 'permission' => '-rw-------', 'path' => '/work/eng/feeds/customer_care/test/q_data_20111 +023.dat', 'modified' => '2011-10-26T00:29:46+0000', 'size' => '379085', 'group' => 'eng', 'accesstime' => '2011-10-26T00:29:46+0000' }, 'path' => '/work/eng/feeds/customer_care/test', 'directory' => { 'owner' => 'tst_act', 'group' => 'eng', 'permission' => 'drwx------', 'path' => '/work/eng/feeds/customer_care/test', 'accesstime' => '1970-01-01T00:00:00+0000', 'modified' => '2011-10-26T00:29:46+0000' }, 'exclude' => '' }; for my $result ($lsResults1, $lsResults2) { for (keys %$result) { when ('file') { print "Filename: $result->{file}{path}\n"; print " Size: $result->{file}{size}\n"; } when ('directory') { given (ref $result->{directory}) { when ('ARRAY') { for my $entry (@{$result->{directory}}) { print "Directory: $entry->{path}\n"; } } when ('HASH') { print "Directory: $result->{directory}{path}\n"; } } } } }

Prints:

Directory: /work/eng/feeds/customer_care Directory: /work/eng/feeds/customer_care/abc Directory: /work/eng/feeds/customer_care/def Directory: /work/eng/feeds/customer_care/test Filename: /work/eng/feeds/customer_care/test/q_data_20111023.dat Size: 379085 Directory: /work/eng/feeds/customer_care/test

Notice the use of ref to determine what type of directory entry is being dealt with and the use of keys to work through the hash entries looking or the interesting stuff.

True laziness is hard work

Replies are listed 'Best First'.
Re^2: Setting up conditional check for printing out keys from array/hash ref
by JaeDre619 (Acolyte) on Oct 27, 2011 at 13:26 UTC
    thanks for your input. yes, the solution I was looking for was to make it recursive. unfortunately, the system I am using has perl version v5.8.6. What changes would I have to make with your solution?

      The sample solution I offered is not in itself recursive, although it could be the guts of a recursive solution.

      given/when is Perl's switch statement support which was introduced with 5.10. A switch statement is really just syntactic sugar for a set of related if statements so you can replace the when blocks with if blocks:

      for my $result ($lsResults1, $lsResults2) { for (keys %$result) { if ($_ eq 'file') { print "Filename: $result->{file}{path}\n"; print " Size: $result->{file}{size}\n"; } elsif ($_ eq 'directory') { my $value = ref $result->{directory}; if ($value eq 'ARRAY') { for my $entry (@{$result->{directory}}) { print "Directory: $entry->{path}\n"; } } elsif ($value eq 'HASH') { print "Directory: $result->{directory}{path}\n"; } } } }
      True laziness is hard work
        Thanks Grandfather! It works nicely. I am doing some testing on it right now.

        There's a point in the directory (where I go higher up in directory) where I see this messageBad index while coercing array into hash

        What's a good way to handle that message?

        Output:

        $ ./tst-loopthrough2.pl --dir /work/eng Bad index while coercing array into hash at ./tst-loopthrough2.pl line + 101. $ ./tst-loopthrough2.pl --dir /work/eng/feeds Directory: /work/eng/feeds Directory: /work/eng/feeds/customer_care $ ./tst-loopthrough2.pl --dir /work/eng/feeds/customer_care Directory: /work/eng/feeds/customer_care Directory: /work/eng/feeds/customer_care/abc Directory: /work/eng/feeds/customer_care/def Directory: /work/eng/feeds/customer_care/test $ ./tst-loopthrough2.pl --dir /work/eng/feeds/customer_care/test Filename: /work/eng/feeds/customer_care/test/q_data_20111023.dat Size: 379085 Directory: /work/eng/feeds/customer_care/test