sub perms { my $arr = shift; if ( !@$arr ) { return ( [] ); } else { return map { my @a = @$arr; my $e = splice @a, $_, 1; map [ $e, @$_ ], perms( \@a ) } ( 0..$#$arr ); } }