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

Hi, I have the following -
$coord_{"AB"}{1} = [420,520,870]; $coord_{"AB"}{2} = [220,520,470]; $coord_{"AB"}{6} = [320,320,270]; $coord_{"AB"}{7} = [520,720,370]; $coord_{"AB"}{8} = [620,520,670]; $coord_{"PL"}{12} = [420,520,570]; $coord_{"PL"}{13} = [220,520,170]; $coord_{"B"}{2} = [320,720,670]; $coord_{"B"}{4} = [520,520,170]; $coord_{"B"}{5} = [620,820,370];


and I wish to print out -

AB 1 = X:420,Y:520,Z:870
AB 2 = X:220,Y:520,Z:470
AB 6 = X:320,Y:320,Z:270
AB 7 = X:520,Y:720,Z:370
AB 8 = X:620,Y:520,Z:670
PL 12 = X:420,Y:520,Z:570
PL 13 = X:220,Y:520,Z:170
B 2 = X:320,Y:720,Z:670
B 4 = X:520,Y:520,Z:170
B 5 = X:620,Y:820,Z:370

how would I do this exactly - using a for or foreach loop.
Thanks,
Barry.

Replies are listed 'Best First'.
Re: iterating through a 2 dimensional hash
by DrManhattan (Chaplain) on Apr 06, 2003 at 13:09 UTC
    #!/usr/bin/perl use strict; my %coord_; $coord_{"AB"}{1} = [420,520,870]; $coord_{"AB"}{2} = [220,520,470]; $coord_{"AB"}{6} = [320,320,270]; $coord_{"AB"}{7} = [520,720,370]; $coord_{"AB"}{8} = [620,520,670]; $coord_{"PL"}{12} = [420,520,570]; $coord_{"PL"}{13} = [220,520,170]; $coord_{"B"}{2} = [320,720,670]; $coord_{"B"}{4} = [520,520,170]; $coord_{"B"}{5} = [620,820,370]; foreach my $key1 (sort keys %coord_) { foreach my $key2 (sort keys %{$coord_{$key1}}) { printf "%s %d = X:%d, Y:%d, Z:%d\n", $key1, $key2, @{$coord_{$key1}{$key2}}; } }
    The ordering of output isn't quite what you wanted, but that can't be helped with a hash, since it doesn't preserve the order in which you insert the elements.

    -Matt

      The ordering of output isn't quite what you wanted, but that can't be helped with a hash, since it doesn't preserve the order in which you insert the elements.

      That is, it could only be helped if you take the trouble to specify a non-canonical order external to the hash, e.g.:

      my @key1_order = qw/AB PL B/; ... foreach my $key1 ( @key1_order ) { ... }
      or assign sortable values within the hash (which could be worked into the hash-creation process):
      $coord_{AB}{order} = 1; $coord_{PL}{order} = 2; $coord_{B}{order} = 3; ... foreach my $key1 ( sort { $coord_{$a}{order} <=> $coord_{$b}{order} } +keys %coord_ ) { ... }
      The order doesnt matter actually - thanks for your help, your solution worked perfectly.