2017-11-15 8 views
0

私は、このテキスト(私のオリジナルテキストの短縮バージョン)を持っている:なぜPerlは複数行の正規表現ですべての正規表現の一致を表示しないのですか?

mytext.txt BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU

私のコードは次のよう、whicですhはすべてのマッチを印刷してファイルに保存することを意図しています。しかし、私はそこに私のオリジナルのファイルに少なくとも10であることを除いて、私は一致を得ることはありません。

open(text, "<mytext.txt"); 

push (@matches,$&) while(<text> =~ m{ 
    ([TR]{6} 
    JFUA 
    [ABR]{1} 
    GAFG 
    ([LOP]{2,3}) 
    [KW]{2,5} 
    (??{ $2 =~ tr/LOP/ABC/r }) 
    AAAABB[UXZ]{1}) 
    /g 
}x); 

print "@matches\n"; 

my $filename = 'results_matches.txt'; 
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!"; 
print $fh "@matches\n"; 
close $fh; 
print "done\n"; 

Iはまた、次のコードを試しており、これも動作しない。

my @matches = <text> =~ m{ 
     ([TR]{6} 
     JFUA 
     [ABR]{1} 
     GAFG 
     ([LOP]{2,3}) 
     [KW]{2,5} 
     (??{ $2 =~ tr/LOP/ABC/r }) 
     AAAABB[UXZ]{1}) 
     /g 
    }x; 

print "@matches\n"; 

Iが正常に一つだけ(最初の)結果を出力次のコードを有しています。しかし、それはすべてのマッチを印刷することができません。

if (<text> =~ m{ 
    ([TR]{6} 
    JFUA 
    [ABR]{1} 
    GAFG 
    ([LOP]{2,3}) 
    [KW]{2,5} 
    (??{ $2 =~ tr/LOP/ABC/r }) 
    AAAABB[UXZ]{1}) 
}x) {print "$1\n";} 

私はこのトピックで回答が続いているが、それらのいずれかの作業を取得することができませんでした:How can I find all matches to a regular expression in Perl?

答えて

1

while <text>を使用することにより、あなたはそれぞれのファイルハンドルから新しいファイルを読んでいますループの反復。ループを繰り返す必要があります。一方は行を反復処理し、内側のループはマッチを反復処理します。

while (my $line = <text>) { 
    push @matches, $1 while $line 
     =~ m{ 
      ([TR]{6} 
      JFUA 
      [ABR] 
      GAFG 
      ([LOP]{2,3}) 
      [KW]{2,5} 
      (??{ $2 =~ tr/LOP/ABC/r }) 
      AAAABB[UXZ]) 
     }xg; 
} 

私もそれは無用だとして、{1}を削除$ &がpenatlyあなたがプログラムで行うすべてのマッチングのパフォーマンスを課しているので代わりに$ & $ 1を使用。 /gを削除し、gを適切な場所(つまり、}xの隣)に追加しました。

テストするとき、ここから入力をコピーしました。つまり、すべての文字が1行になっています。入力が異なる場合は、引用符ではなくコードの書式を使用してください。

関連する問題