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

Hi, Having an array of arrays (@AoA), containing an index of elements stored in a second array (@A):
my @AoA = ( [ '1', '2', '10' ], [ '3', '4', 5' ], [ '6', '8', '11' ], [ '0', '7', '9' ], ); my @A = qw(0 0 0 0 1 2 0 0 1 0 1 0);
Walking through @AoA, I would like the AoA index $i $j to be reported for the first occurence to in the second array is not zero.
@AoA[$i][$j] = $index;
Store $i, $j for the first occurence of
@A[$index] !=0
Thanks, best.

Replies are listed 'Best First'.
Re: Control loop 2D array
by BrowserUk (Patriarch) on Jun 16, 2007 at 17:25 UTC

    Like this? :)

    #! perl -slw use strict; my @AoA = ( [ '1', '2', '10' ], [ '3', '4', '5' ], [ '6', '8', '11' ], [ '0', '7', '9' ], ); my @A = qw(0 0 0 0 1 2 0 0 1 0 1 0); my( $i, $j ) = ( 0, 0 ); $j++ < $#{ $AoA[ $i ] } or $i++, $j=0 while $i < @AoA and not $A[ $AoA[$i][$j] ]; ## Updated per [ysth]'s observation below print $i == @AoA ? 'not found' : "i:$i j:$j"; __END__ C:\test>junk i:0 j:2

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      How about a deobfuscated version?

        Not very satisfying because of the need to use a 'goto' to quit the loops early, and the need to duplicate the index vars because Perl localises them to loop even if they are pre-existing vars.

        I tried suggesting that the latter behaviour was a bug a while ago and got shouted down.

        #! perl -slw use strict; my @AoA = ( [ '1', '2', '11' ], [ '3', '3', '6' ], [ '6', '8', '11' ], [ '0', '7', '9' ], ); my @A = qw(0 0 0 0 1 2 0 0 1 0 1 0); my( $p, $q ); OUTER: for my $i ( 0 .. $#AoA ) { for my $j ( 0 .. $#{ $AoA[ $i ] } ) { ( $p, $q ) = ( $i, $j ) and last OUTER if $A[ $AoA[ $i ][ $j ] ]; } } print "i:$p j:$q";

        I'm not sure why you are using the outer loop below?


        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.
Re: Control loop 2D array
by ysth (Canon) on Jun 17, 2007 at 09:12 UTC
    Or maybe like this:
    # look for @AoA row and col containing index # for first non-zero element in @A for my $index (0..$#A) { if ($A[$index]) { ROW: for my $row (0..$#AoA) { for my $col (0..$#{$AoA[$row]}) { if ($AoA[$row][$col] == $index) { print "$row $col\n"; last ROW; } } } last; } }