> > I'm cobbling up a bit of code that'll need to do something akin to 'map' on two 
> > lists at the same time.  ...
> 
> Footnote: I realized, that while doing 'mapN' is interesting. what I'm actually 
> in the midst of implementing is 'foreach' for multiple lists.  The template I 
> had in mind was something like:
>    forall my ($lotsofvariables) (list of listrefs)
> and then it'd alias the vbls in the lotsofvariables [or en masse if there's an 
> array, of course] to each parallel entry from the various lists.
> 
> I wonder if there's a pretty/elegant way to do that...

Hi,

Pretty?  Elegant?  In my example, it depends whether you are examining
the point of use... or the implimentation.  The principle is to covert:

@array1 = ["a", "b", "c"]
@array2 = ["1", "2", "3"]

into

@result = [ ["a", "1"],
            ["b", "2"],
            ["c", "3"] ];

and then iterate over that.  Obviously, I called the function magic()
because it's going to seem rather complex and UGLY.  Call it pre-mature
optimisation for speed, if you like.  Code quality is about 0.1% and
does not reflect normal code quality, guess I wanted more to see if you
liked the approach.  Do NOT use *as is*, you definately want to check
you get array-refs on all elements (skipped) since it's VERY easy to
do:

magic @array1, @array2;

and not get what you expected.

My license for this is simple: fix/improve, copy and paste.  Oh, and
I don't want my name in your otherwise clean code :)

__PERL CODE__
#!/usr/bin/perl -w

use strict;
use Carp;

# Basic test... iterates over and prints results
my @result = magic(["1", "2", "3"], ["a", "b", "c"], ["x", "y", "z"]);

foreach (@result) {
    my ($first, $second, $third) = @{$_};

    # Do something with values
    print "$first : $second : $third\n";
}

# The UGLY stuff
sub magic {
    my @array = @_;

    # Check we have only array references
    # ... exercise for reader... laziness for me.

    # Find length of first array, then check consistency
    my $length = $#{$array[0]};

    for (@_) {
        if ($length != scalar $#{$_}) {
            croak "Array lengths don't match";
        }
    }

    # Combine everything, using an eval for speed
    my @result;
    my $code;

    for (0..$#_) {
        $code .= "my \@array_$_ = \@{\$array[$_]};\n";
    }

    $code .= 'for (0..$length) {'."\n".'   push @result, [';

    for (0..$#_) {
        $code .= "\$array_${_}[\$_]";
        $code .= ", " unless $#_ == $_;
    }

    $code .= "];\n}";
    eval $code;
    return @result;
}
__END__

Jonathan Paton <--- evil programmer

sub point {
    (list != array) and see("Programming Perl, pages 72-76.");
}


=====
s''! v+v+v+v+  J r e P    h+h+h+h+ !s`\x21`~`g,s`^ . | ~.*``mg,$v=q.
 P ! v-v-v-v-  u l r e r  h-h-h-   !12.,@.=m`.`g;do{$.=$2.$1,$.=~s`h
 E !   v+v+v+  s     k e  h+h+     !`2`x,$.=~s`v`31`,print$.[$v+=$.]
 R !     v-v-  t H a c h  h-       !}while/([hv])([+-])/g;print"\xA"
 L !             A n o t           !';$..=$1while/([^!]*)$/mg;eval$.

__________________________________________________
Do You Yahoo!?
Everything you'll ever need on one web page
from News and Sport to Email and Music Charts
http://uk.my.yahoo.com

Reply via email to