Фактически вы распределяете пробелы по всем позициям между символами.На каждой позиции пространство либо реализовано, либо нет для каждой комбинации.Таким образом, вы можете представить его как двоичное число, 1 означает наличие пробела, 0 означает отсутствие пробела.
#!/usr/bin/perl
use warnings;
use strict;
my $num = shift;
my @digits = split //, $num;
my $length = length($num) - 1;
if ($length == 0) {
print "$num\n";
exit;
}
for my $i (0 .. 2 ** $length - 1) {
my $mask = sprintf "%0${length}b", $i;
my @replace_arr = split //, $mask;
my $idx = 0;
for (@replace_arr, '') {
print $digits[$idx];
print ' ' if $_;
$idx++;
}
print "\n";
}