in reply to Re: Re: A hash of an array containing hashes & arrays
in thread A hash of an array containing hashes & arrays

You can test ref using eq. Try this, for example:
perl -le '$foo{"bar"} = ["a","b"]; print ref $foo{"bar"}'
... prints "ARRAY". But if for some reason you're testing the stringification of an array reference (not the return value of ref), then you shouldn't use eq.

What are you expecting to see in your output? Hashes are not interpolated into strings, but arrays are, so printing "Array in Array item: @$item" should print the array elements in $item. A clearer way would be a foreach loop or map, perhaps like this:

if (ref $item eq 'ARRAY') { print "Array in Array item:\n"; foreach (@$item) { print " $_\n"; } } elsif (ref $item eq 'HASH') { print "Hash in Array item:\n"; foreach (keys %$item) { print " $_ -> $item->{$_}\n"; } } else { print "Array Item: $item\n"; }

-- Mike

--
just,my${.02}

Replies are listed 'Best First'.
Re: Re: Re: Re: A hash of an array containing hashes & arrays
by ebodine (Novice) on Aug 21, 2002 at 21:35 UTC
    The following is what I ended up doing. Part of the problem here was that I didn't know exactly what the data was (maintaining someone else's 12k lines of perl w/ almost no comments is a b****) and I still don't know where some of it is coming from. Any suggestions for improvement would be appreciated.

    The data was arranged:
    %::Volume_Info = { 0, 512, 1048576, 1, %spindles = { 0 => ARRAY 1 => ARRAY 2 => ARRAY 3 => ARRAY }, [ ARRAY ], %copy_pool = { 0 => [ ARRAY, 0, 0, 1] }, -1, 0, 0, 0, }
    for my $vol_key ( keys %::Volume_Info ) { print "Volume " . ref($::Volume_Info{$vol_key}) . "\n"; foreach my $item ( $::Volume_Info{$vol_key} ) { if (ref($item) eq "ARRAY") { foreach my $item2 (@$item) { if (ref($item2) eq "ARRAY") { foreach my $ar_el (@$item2) { print "array_element: @$ar_el\n"; } } elsif (ref($item2) eq "HASH") { foreach my $hash_key (keys %$item2){ print "\t hash key: $hash_key\n"; if (ref($$item2{$hash_key}) eq "ARRAY") { foreach my $item3 ($$item2{$hash_key}) + { # if (ref($item3) eq "ARRAY") { # foreach my $an_el (@$item3) { # print "\t\t\tanother elem +ent @$an_el\n"; # } # } else { print "\t\tspindle values: @$i +tem3\n"; #} } } } } else { print "Array Item: $item2 \n"; } } } } }
      Ohhhh... well if you're just trying to see what someone else's data looks like, have you considered using Data::Dumper instead? It makes something like that very easy.
      use Data::Dumper; my %Volume_Info = ( alpha => [ 0, 512, 1048576, 1, { one => 'first_hash' }, [ 'two', 'first_array' ], { three => 'second_hash' }, -1, 0, 'zfod', 0 ], beta => [ 1, 2, { four => 'third_hash' }, 2, 1 ] ); print Dumper(\%Volume_Info);
      ...which produces...
      $VAR1 = { 'beta' => [ 1, 2, { 'four' => 'third_hash' }, 2, 1 ], 'alpha' => [ 0, 512, 1048576, 1, { 'one' => 'first_hash' }, [ 'two', 'first_array' ], { 'three' => 'second_hash' }, -1, 0, 'zfod', 0 ] };
      Not sure if this fits your purposes, but I felt it was worth mentioning (especially after misleading you with my first response).

      -Bird

        Never tried Data::Dumper before. Looks like it is exactly what I am looking for. Thanks

        --ERick