#! perl -slw sub reduce (&@) { my $code = shift; return shift unless @_ > 1; my $caller = caller; local(*{$caller."::a"}) = \my $a; local(*{$caller."::b"}) = \my $b; $a = shift; foreach (@_) { $b = $_; $a = &{$code}(); } $a; } use strict; #use List::Util qw[ reduce ]; sub s1 { my $r = shift; reduce{ $r->[0] } 1 .. 10; } while( 1 ) { my $t = map s1( $_ ), [1], [2], [3]; }