SPUG: Another hash/array question from Duane

Yitzchak Scott-Thoennes sthoenna at efn.org
Mon Aug 1 12:47:52 PDT 2005


On Mon, Aug 01, 2005 at 12:34:24PM -0700, Duane Blanchard wrote:
> Thanks to everyone who has helped me out already, I'm nearly done
> (haha). I have looked at data::dumper and it will be very useful for
> part of this project, but I am also using this to teach myself (with
> great assistance from the group) more about data structures and
> references.
> 
> Right now, I'm trying to print the zeroeth element of the zeroeth row
> of the hash in the embedded hash. I've had to sanitze the data for my
> client. On line 45 below, I want to print the first element of the
> first row of my multidimensional array.
> 
> I've been through the perldoc for ref and reference. I've tried the
> arrow operator and doubling up my dollar signs. Nothing seems to work.
> Any further help would be greatly appreciated.

I suggest reading the short but very helpful:
   http://perlmonks.org/?node=References+quick+reference
before you go much further, and consulting it at every difficulty
until you internalize the rules it presents.

> while (my ($key, $val) = each %outer_hash)

Ah, my fault; I was trying to show the above as an alternative to the
easier:
  for my $key (keys %outer_hash) {
  }

At each iteration, each() returns the key *and it's associated value*
(in list context).  That means instead of

   print $outer_hash{$key}{$val}[...

you should be doing just:

   print $outer_hash{$key}[...

or:

   print $val->[...

($val *is* $outer_hash{$key}, but you need the -> to show you are derefing
the scalar reference in $val, as opposed to $val[... which is looking up
an element in the array @val.

> {	if (ref($val) eq "HASH")
> 	{	print "KEY - $key\n" .
> 				"VAL - $val\n\n";
> 		for ($i = 0; $i < 3; $i++)
> 		{	for ($j = 0; $j < 9; $j++)
> 			{	print $outer_hash{$key}{$val}[$i][$j] . "\t";	# HERE IS THE STICKING POINT
> 			}
> 			print "\n";
> 		}
> 	} 
> 	print "\n";
> }


More information about the spug-list mailing list