1

「E」が出現するたびに文字列を分割しようとしています。しかし、出力では、以前の破損ループで以前に到着した部分文字列をスキップしたいと考えています。たとえば。「E」が文字列$s='ABCDEABCDEABCDEABCD'の 5 番目、10 番目、15 番目の位置に存在する文字列を取得すると、位置 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 に答える