1

我试图在每次出现“E”时打破一个字符串。但在输出中,我想跳过在前一个破损循环中较早到达的那些子字符串。例如。如果我在字符串$s='ABCDEABCDEABCDEABCD'中的第 5、第 10 和第 15 位出现“E”的字符串,则由于位置 10 断裂而出现的子串不应出现在位置 15 断裂导致的子串中。下面给出的脚本在“E”的每个位置都中断。但我无法停止子字符串的重复。请帮忙!

my $s = 'ABCDEAXBCDEAYBCDEAZBCD';
my @where; my @array;my @final;
my $result; my $j; 

for ($j = 0; $j <= 2; $j++) {

    $where[j] = index($s,"E",$where[j-1]) + 1;
    push @array, $where[j];
}


for my $array (@array) {

    substr($s, $array-1, 1) = "\0";
    my @a = split(/E(?!P)/, $s);
    substr($s, $array-1, 1) = 'E';

    $_ =~ s/\0/E/g foreach (@a);
    $result = join ("E,", @a).'E'; 
    @final  = split(/,/, $result);
    print "@final\n";
}

我得到的输出是:

ABCDEAXBCDE AYBCDE AZBCDE
ABCDE AXBCDEAYBCDE AZBCDE
ABCDE AXBCDE AYBCDEAZBCDE

预期输出:

ABCDEAXBCDE AYBCDE AZBCDE
ABCDE AXBCDEAYBCDE
AXBCDE AYBCDEAZBCDE
4

1 回答 1

2

我不明白您的问题的目的/描述,但您可以添加一个哈希来跟踪您之前看到的子字符串并删除它们,方法是将最后一个循环更改为:

my %seen;
for my $array (@array) {
  substr($s, $array-1, 1) = "\0";
  my @a = split(/E(?!P)/, $s);
  substr($s, $array-1, 1) = 'E';
  $_ =~ s/\0/E/g foreach (@a);
  $result = join ("E,", @a).'E'; 
  @final = grep { !exists $seen{$_} } split(/,/, $result);
  $seen{$_}=1 for @final;
  print "@final\n";
}

这会将输出更改为:

ABCDEAXBCDE AYBCDE AZBCDE
ABCDE AXBCDEAYBCDE
AXBCDE AYBCDEAZBCDE

您的代码看起来像是从 C 语言翻译过来的。如果您尝试更清楚地描述您想要做什么,也许有人可以帮助您提供更惯用的 Perl 版本。

于 2012-10-28T16:04:09.137 回答