$str="abcde"
我希望输出数组为
a,b,c,d,e,ab,bc,cd,de,abc,bcd,cde,abcd,bcde,abcde.
即从左向右移动,所有不同长度的所有可能组合。
此外,还有删除重复元素的附加功能,例如
$str="abcdd"
可能在数组中有许多重复的项目
这就是我试过的
for ($j=1;$j<=$n;$j++) {
my @tmp = unpack("(A$j)*", $seq);
print "@tmp\n";
}
答案 0 :(得分:3)
这是一个非常简单的问题。该程序在一行中解决了这个问题,尽管双循环可能更清晰。
use strict;
use warnings;
use 5.010;
my $str = 'abcde';
my @list;
push @list, $str =~ /(?=(.{$_}))/g for 1 .. length $str;
say join ',', @list;
<强>输出强>
a,b,c,d,e,ab,bc,cd,de,abc,bcd,cde,abcd,bcde,abcde
答案 1 :(得分:1)
解决这个问题的唯一方法是知道需要使用Positive lookahead assertion才能找到重叠的正则表达式匹配。
如果您只需要唯一的子字符串,则可以阅读perlfaq4 - How can I remove duplicate elements from a list or array?或使用List::MoreUtils uniq
use strict;
use warnings;
use List::MoreUtils qw(uniq);
for my $string (qw(abcde abcdd)) {
my @list = uniq map { $string =~ /(?=(.{$_}))/g } ( 1 .. length $string );
print "$string - ", join( ',', @list ), "\n";
}
输出:
abcde - a,b,c,d,e,ab,bc,cd,de,abc,bcd,cde,abcd,bcde,abcde
abcdd - a,b,c,d,ab,bc,cd,dd,abc,bcd,cdd,abcd,bcdd,abcdd