Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Looping on Array of Arrays (by References)

by jjap (Monk)
on Sep 26, 2011 at 18:18 UTC ( [id://927916]=perlquestion: print w/replies, xml ) Need Help??

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

Dear Monks,

The following code selects a few arrays from an AoA which will passed on as arguments to a subroutine.

It does work, but since I receive that AoA through an array reference from a previous sub, would there be a way to have the loop work directly on the arrayref instead of dereferencing the arrayref into a AoA?
use strict; use warnings; use Data::Dumper; my @AoA = ([10001, 2.71, 4], [160001, 123.4, 5], [170001, 234.9, 9], [ +670002, 44.8, 11]); # data structure actually received as ref my $AoAref = \@AoA; my ($arg1, $arg2, $arg3); # AoA is OK print Dumper ($AoAref); for my $i (0 .. $#AoA){ my $aref = $AoA[$i]; print "array is: $AoA[$i]\n"; $arg1 = $AoA[$i] if ($AoA[$i][0] == "160001"); $arg2 = $AoA[$i] if ($AoA[$i][0] == "170001"); $arg3 = $AoA[$i] if ($AoA[$i][0] == "670002"); } # Checking that got what is expected, OK print "Ex.:argument1 $arg1\n"; print "argument deref @$arg1\n"; # Passing to &someothersub($arg1, $arg2, $arg3);
Any way (if possible elegant) to operate on AoAref directly?
for my $aref ( @$AoAref ) { print "\t [ @$aref ],"; # not exactly sure what i'm doing here... }
The Cookbook and perllol do not seem to address that specifically

Again all guidance and advice will be greatly appreciated

UpdateThanks to Ikegami for yet another masterful tutorial and to Util for also a very Perlish solution.

Replies are listed 'Best First'.
Re: Looping on Array of Arrays (by References)
by ikegami (Patriarch) on Sep 26, 2011 at 18:32 UTC
    By blindly changing "AoA" to "{$AoAref}",
    for my $i (0 .. $#AoA){ my $aref = $AoA[$i]; print "array is: $AoA[$i]\n"; $arg1 = $AoA[$i] if $AoA[$i][0] == "160001"; $arg2 = $AoA[$i] if $AoA[$i][0] == "170001"; $arg3 = $AoA[$i] if $AoA[$i][0] == "670002"; }
    becomes
    for my $i (0 .. $#{$AoAref}){ my $aref = ${$AoAref}[$i]; print "array is: ${$AoAref}[$i]\n"; $arg1 = ${$AoAref}[$i] if ${$AoAref}[$i][0] == "160001"; $arg2 = ${$AoAref}[$i] if ${$AoAref}[$i][0] == "170001"; $arg3 = ${$AoAref}[$i] if ${$AoAref}[$i][0] == "670002"; }
    We can clean this up, some, though.
    for my $i (0 .. $#$AoAref){ my $aref = $AoAref->[$i]; print "array is: $AoAref->[$i]\n"; $arg1 = $AoAref->[$i] if $AoAref->[$i][0] == "160001"; $arg2 = $AoAref->[$i] if $AoAref->[$i][0] == "170001"; $arg3 = $AoAref->[$i] if $AoAref->[$i][0] == "670002"; }
    or if you actually use the $aref you created,
    for my $i (0 .. $#$AoAref){ my $aref = $AoAref->[$i]; print "array is: $aref\n"; $arg1 = $aref if $aref->[0] == "160001"; $arg2 = $aref if $aref->[0] == "170001"; $arg3 = $aref if $aref->[0] == "670002"; }
    And to get rid of useless $i:
    for my $aref (@$AoAref) { $arg1 = $aref if $aref->[0] == "160001"; $arg2 = $aref if $aref->[0] == "170001"; $arg3 = $aref if $aref->[0] == "670002"; }
Re: Looping on Array of Arrays (by References)
by Util (Priest) on Sep 26, 2011 at 22:12 UTC

    ikegami++

    Note that you can also convert your multiple if statments into direct access via a hash:

    my $AoAref = [ [ 10001, 2.71, 4 ], [ 160001, 123.4, 5 ], [ 170001, 234.9, 9 ], [ 670002, 44.8, 11 ], ]; my %HoA = map { $_->[0] => $_ } @{$AoAref}; my ( $arg1, $arg2, $arg3 ) = @HoA{ qw( 160001 170001 670002 ) }; printf "%5d %5.1f %2d\n", @{$_} for $arg1, $arg2, $arg3;

    Output:

    160001 123.4  5
    170001 234.9  9
    670002  44.8 11
    

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (1)
As of 2024-04-25 03:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found