# Sample usage: my @array= ( [ 'a'..'c',undef ], [ 1..7 ], [ 'A'..'E' ] ); my @trans= mapcar { [@_] } @array; # @transpose is now ( ['a',1,'A'],['b',2,'B'],['c',3,'C'], # [undef,4,'D'],[5,'E'],[6] ) my @transpose= mapcaru { [@_] } @array; # @trans is now ( ['a',1,'A'],['b',2,'B'],['c',3,'C'], # [undef,4,'D'],[undef,5,'E'],[undef,6,undef] ) #### #!/usr/bin/perl -w package mapcar; use strict; require Exporter; use vars qw( $VERSION @EXPORT @ISA ); BEGIN { $VERSION= 1.01; @EXPORT= qw( mapcar mapcaru ); @ISA= qw( Exporter ); } sub mapcaru (&@) { my $sub= shift; if( ! @_ ) { require Carp; Carp::croak( "mapcaru: Nothing to map" ); } my $max= 0; for my $av ( @_ ) { if( ! UNIVERSAL::isa( $av, "ARRAY" ) ) { require Carp; Carp::croak( "mapcaru: Not an array reference (", ref($av) ? ref($av) : $av, ")" ); } $max= @$av if $max < @$av; } my @ret; for( my $i= 0; $i < $max; $i++ ) { push @ret, &$sub( map { $_->[$i] } @_ ); } return wantarray ? @ret : \@ret; } sub mapcar (&@) { my $sub= shift; if( ! @_ ) { require Carp; Carp::croak( "mapcar: Nothing to map" ); } my $max= 0; for my $av ( @_ ) { if( ! UNIVERSAL::isa( $av, "ARRAY" ) ) { require Carp; Carp::croak( "mapcar: Not an array reference (", ref($av) ? ref($av) : $av, ")" ); } $max= @$av if $max < @$av; } my @ret; for( my $i= 0; $i < $max; $i++ ) { push @ret, &$sub( map { $i < @$_ ? $_->[$i] : () } @_ ); } return wantarray ? @ret : \@ret; } 1;