#https://perlmonks.org/?node_id=11124854 use strict; use warnings; use Data::Dump qw/pp dd/; our $level=0; sub permutation { my ($perm,@set) = @_; local $level = $level+1; print " "x$level . "$level:$perm\n"; print "$perm\n" || return unless (@set); permutation($perm.$set[$_],@set[0..$_-1],@set[$_+1..$#set]) foreach (0..$#set); } my @input = (qw/a b c d/); permutation('',@input);