#!/usr/bin/perl sub permute { my $callback = shift; my $code; for my $i (0..$#_) { $code .= 'for my $e'.$i.' (@{$_['.$i.']}) {'; } $code .= '$callback->('.join(',', map "\$e$_", 0..$#_).');'; $code .= '}' x @_; eval $code; } my @inputs = ( [qw( 1 2 )], [qw( a b )], [qw( # * & )], ); permute( sub { print join(',', @_), "\n"; }, @inputs ); __END__ 1,a,# 1,a,* 1,a,& 1,b,# 1,b,* 1,b,& 2,a,# 2,a,* 2,a,& 2,b,# 2,b,* 2,b,&