【问题标题】:Use Perl to extract all possible substrings使用 Perl 提取所有可能的子字符串
【发布时间】:2014-09-17 09:44:20
【问题描述】:
$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";
} 

【问题讨论】:

  • 向我们展示您的尝试
  • for($j=1;$j

标签: perl substring


【解决方案1】:

这是一个极其简单的问题。这个程序在一行中解决了它,虽然双循环可能会更清晰。

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

【讨论】:

  • 如何避免重复,比如字符串aacde,我不希望a,a在@list中出现两次
【解决方案2】:

解决此问题的唯一技巧是知道需要使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多