В CPAN есть несколько модулей перестановки списков, многие из которых приведены в вопросе, связанном выше: Как я могу сгенерировать все перестановки массива в Perl?
Используя список :: Permutor модуль:
my $template = 211;
my %strings = (
1 => 1,
2 => 'abc',
3 => 'xyz',
);
use List::Permutor ();
my $perm = List::Permutor->new(split //, $template);
my %seen;
while (my @set = $perm->next) {
my $str = join '' => @strings{@set};
say $str unless $seen{$str}++;
}
, который печатает:
abc11
1abc1
11abc
Обратите внимание, что у вас будут проблемы с использованием пустых чисел в шаблоне, если вы выйдете за пределы клавиш 0 .. 9
,(означает 10
означает 10
или 1,0
...).Вам, вероятно, следует изменить свой шаблон, чтобы иметь разделитель записей.