sub reduce (&@) { my $code = shift; no strict 'refs'; return shift unless @_ > 1; use vars qw($a $b); my $caller = caller; local(*{$caller."::a"}) = \my $a; local(*{$caller."::b"}) = \my $b; $a = shift; foreach (@_) { $b = $_; print ">$code<\n"; $a = &{$code}(); } $a; } use vars qw($a $b); sub sum (@) { reduce { $a + $b } @_ } @arr = (0,0,1, 3,2,0, 1,1,1, 11,100,12); push @Res, sum splice(@arr,0,3) while @arr; print "@Res\n";