my $str = '7c9695cb23a71d851688cc0d7f8b1072'; my @nums = map {hex} split '', $str; my @ops = qw(+ -); my @iter = (0) x (length($str) - 1); MAIN: while (1) { my @set = (@ops[@iter], ''); my $newstr = join '', map {$nums[$_] . $set[$_]} (0..$#nums); print "$newstr\n" if 42 == eval $newstr; # Increment my $i = $#iter; while (++$iter[$i] == @ops) { $iter[$i--] = 0; last MAIN if $i < 0; } }