sub repeat { my $n = shift; my $x = shift; my $array = []; for($i = 0; $i < $n; $i++){ push @{$array}, $x; } return $array; } sub apply { my ($func, $args) = @_; my $size = @{$args}; my $app = repeat($size, '(shift @{$x})'); eval 'sub _apply { my $f = shift; my $x = shift; $f->(' . join(',', @{$app}) . '); }'; return _apply(\&$func, $args); } #### sub test { my $x = shift; my $y = shift; my $z = shift; print $x + $y + $z; } # output 6 apply(\&test, [1,2,3]);