Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

looping over multiple arrays

by danger (Priest)
on Jan 06, 2001 at 02:46 UTC ( #50165=snippet: print w/replies, xml ) Need Help??

Just an example of building an iterator with a closure to walk through multiple arrays in parallel (maybe you have a table (2d array) and want to walk the columns). This is just a simple one that runs through the arrays and then resets so it can be used again:

sub parallel_it {
    my @arr_refs = @_;
    my $iter = 0;
    return sub {
        my @return = map{$_->[$iter]}@arr_refs;
        return @return if grep{defined $_}@return;
        $iter = 0;
my @one   = (0, 1, 2, 3, 4, 5, 6);
my @two   = qw/Sun Mon Tue Wed Thu Fri Sat/;
my @three = qw/Zeroday Oneday Twoday Threeday 
               Fourday Fiveday Sixday/;

my $triples = parallel_it( \(@one,@two,@three) );
while( my($a, $b, $c) = $triples->() ){
    print "$a:$b:$c\n";

# update @one and go again
@one = qw/A B C D E F G/;
while( my($a, $b, $c) = $triples->() ){
    print "$a:$b:$c\n";

my @table = ( [ 1, undef, 3, 4],
              [ 6, 7,],
              [qw/a b c d e f/],
my $columns = parallel_it(@table);
while( my @col = $columns->() ){
    print join(',', map{ $_ ? $_ : ' ' } @col),"\n";

Replies are listed 'Best First'.
Re: looping over multiple arrays
by chipmunk (Parson) on Jan 06, 2001 at 03:08 UTC
    Very nice. There is one addition that I would suggest; allowing for parallel undefs in the arrays. Otherwise the iterator will reset if all the arrays happen to contain undef at the same index, even if there are more elements later in the arrays. Here's one possible solution:
    sub parallel_it { my @arr_refs = @_; my $iter = 0; return sub { if (not grep $iter < @$_, @arr_refs) { $iter = 0; return; } my @return = map { $_->[$iter] } @arr_refs; $iter++; return @return; }; }

      Oops, I had that taken care of in an alternate version (that worked on copies of the arrays and thus couldn't be reused if arrays were updated), but a few cells back in the visual cortex must have malfunctioned and I didn't see it here. Thanks for pointing it out.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://50165]
[haukex]: Corion: Yes exactly, in the author tests I don't worry about portability as much, I also don't list the author tests' dependencies in Makefile.PL
[haukex]: I figure someone who wants to contribute will know how to install the missing modules ;-) Not the nicest way to go but I don't think many people are using my modules yet
[ambrus]: Corion: some of these stupid syntax highlighters assume that too. just look at the table in http://perldoc. functions/pack. html for example.
[haukex]: ..."yet" ;-) I haven't had to deal with Dist::Zilla yet but I've heard about how it's a big setup
[ambrus]: I really don't like automagic stuff. I'm happy when computers do exactly what I tell them, even if that means they sometimes do the wrong thing.

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (14)
As of 2017-02-27 12:41 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (385 votes). Check out past polls.