使用Perl提取所有可能的子字符串

时间:2014-09-17 09:44:21

标签: perl substring

$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";
} 

2 个答案:

答案 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