所有可能的密钥组合

时间:2012-01-30 21:35:57

标签: perl

说我有哈希:

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

在Perl中,如何给出类似211的字符串,并根据该哈希得到所有可能的组合:abc11,1abc1,11abc等...

2 个答案:

答案 0 :(得分: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,则在模板中使用裸号时会遇到问题。 (1010还是1,0 ......)。您可能应该将模板更改为具有记录分隔符。

答案 1 :(得分:1)

您可以尝试类似的方法,从字符串中获取数字,然后循环并构建字符串:

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