Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

iterating through a 2 dimensional hash

by Baz (Friar)
on Apr 06, 2003 at 12:57 UTC ( [id://248426]=perlquestion: print w/replies, xml ) Need Help??

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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://248426]
Approved by simon.proctor
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (3)
As of 2024-04-19 19:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found