Hmm... I just finished my solution when I saw the mapcar one posted by Evan. Well, here's mine anyway. It is worse because: 1) it's not a package, 2) it doesn't support aliased variables (i.e. you can't modify the incoming arrays like you can with map). But, it does use letters $a, $b, $c, etc. as Bernie requested. Mine operates on the minimum number of elements, instead of the maximum, in all of the arrays. Perl6 could do this better with variable aliases.
#!/usr/bin/perl sub mapn(&@) { my $coderef = shift; return () if (@_==0); my $n = @{$_[0]}; my @result; foreach my $arg (1 .. $#_) { $n = @{$_[$arg]} if (@{$_[$arg]} < $n); } foreach $i (0..$n-1) { foreach my $arg (0 .. $#_) { my $letter = chr(ord('a') + $arg); $$letter = $_[$arg]->[$i]; } push @result, &$coderef; } @result; } my @one = qw(foo bar baz fwip); my @two = qw(spam ham jam flimflam); my @tri = qw(1 2 3 4); my @out = mapn {"$c:$a:$b"} \@one, \@two, \@tri; print "@out\n"; Chris Bernie Cosell wrote: > On 29 Oct 2002 at 13:05, Bernie Cosell wrote: > > >>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... > > /bernie\ >