2012-01-30 2 views
0

Say У меня есть хэш:Все возможные комбинации с ключевыми

1 => 1 
2 => abc 
3 => xyz 

В Perl, как я могу дать строку как 211, и получить все возможные комбинации в соответствии с этой хэш: abc11, 1abc1, 11abc и т.д. ...

+0

Это хэш, а не список. –

+0

Возможный дубликат: http://stackoverflow.com/questions/635768/how-can-i-generate-all-permutations-of-an-array-in-perl – Richard

ответ

4

Есть несколько перестановок списка модулей на CPAN, многие в вопросе связан выше: How can I generate all permutations of an array in Perl?

Использование List::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 ...). Вероятно, вы должны изменить свой шаблон, чтобы иметь разделитель записей.

1

Вы могли бы попробовать что-то подобное, получить цифры из строки, и петлю и построить строку:

my @digits = ($str =~ /(\d)/g); 
my $val; 
foreach (@digits) { 
    # %values holds key/value pairs 
    $val .= $values{$_}; 
}