2017-11-15 2 views
0

Ich habe diesen Text (gekürzte Version meiner ursprünglichen Text):Warum druckt Perl nicht alle Regex-Übereinstimmungen in einem mehrzeiligen Regex?

MyText.txt BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU

Mein Code ist die folgende, whic h beabsichtigt, alle Übereinstimmungen zu drucken und sie dann in einer Datei zu speichern. Aber ich bekomme keine Übereinstimmungen, solange ich dort mindestens 10 in meiner ursprünglichen Datei habe.

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

Ich habe auch versucht, den folgenden Code und das funktioniert auch nicht:

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

ich den folgenden Code haben, der nur erfolgreich ein ausdruckt (die erste) Ergebnis. Aber es schlägt fehl, alle Übereinstimmungen zu drucken.

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

ich die Antworten in diesem Thema verfolgt habe, aber nicht in der Lage gewesen, einer von ihnen zu arbeiten: How can I find all matches to a regular expression in Perl?

Antwort

1

Durch die Verwendung von while <text>, Sie werden auf die jeweils eine neue Datei aus der Datei-Handle lesen Iteration der Schleife. Sie müssen Schleifen, eine Iteration über die Linien und die innere Schleife, um über die Übereinstimmungen zu iterieren.

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

Ich entfernte auch {1} wie es nutzlos ist, verwendet 1 $ statt $ & weil $ & erlegt eine Leistung penatly auf alle passenden Sie in einem Programm zu tun; und entfernte die /g und fügte die g an der richtigen Stelle (d. h. neben }x) hinzu.

Beim Testen kopierte ich die Eingabe von hier nicht, d. H. Ich habe alle Zeichen in einer Zeile. Wenn Ihre Eingabe anders ist, verwenden Sie bitte die Codeformatierung, nicht das Zitat.

Verwandte Themen