if( 0 == @_ ) { &$sub(); } elsif( 1 == @_ ) { &$sub( $_[0][0] ); } elsif( 2 == @_ ) { &$sub( $_[0][0], $_[1][0] ); } elsif( 3 == @_ ) { &$sub( $_[0][0], $_[1][0], $_[2][0] ); # etc to some arbitrary maximum number of arguments } #### eval "&\$sub( " . join( ", ", map "\$_[$_][0]", 0..$#_ ) . " )" #### if ($#_ <= 255) { my $lim = $#_; &$sub(($_[0][0],$_[1][0],$_[2][0],$_[3][0],$_[4][0], $_[5][0],$_[6][0],$_[7][0],$_[8][0],$_[9][0], ... $_[255] )[0..$lim]); $#_ = $lim # remove autovivified arrayrefs } else { eval "&\$sub( " . join( ", ", map "\$_[$_][0]", 0..$#_ ) . " )"; }