2009-03-23 7 views
3

Ich bin neu in Perl und arbeite an einem Projekt für die Schule und bin fest.Perl Regex geteilt mit neuen Linien

Eingabe: Eine gegebene Textdatei, die E-Mail-Adressen enthält, die durch Leerzeichen, Tabulator, ",", ";" oder ":" [kann auf getrennten Zeilen sein].

Ich versuche, die E-Mail-Adressen einzulesen und sie in ein Array zu setzen. Ich bin in der Lage, die Daten auf einer Linie zu analysieren, aber wenn es Zeilenumbrüche oder -rückgaben gibt, bekomme ich nur das letzte Element.

Kann mir jemand helfen, herauszufinden, wie man eine Liste mit jeder Adresse in einer separaten Zeile aufnimmt und analysiert? Ich habe ein wenig über Regex gelesen, brauche aber viel mehr Übung. Vielen Dank.

open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!"; 

# 
while (<EmailAddresses>) 
{ 
    chomp; 
    # Split the line into words 
    @lines = split /[ ,;:\t\r\n(\t\r\n\s)+?]/; 
} 

foreach $value (@lines) 
{ 
    print $value . "\n"; 
} 

Antwort

7
open(EmailAddresses, "EmailAdressesCommaList.txt") || die "Can not open file $!"; 
while(<EmailAddresses>) { 
    chomp; 
    push @lines, split /[ ,;:\t\r\n(\t\r\n\s)+?]/; 
} 
foreach $value (@lines) { 
    print $value . "\n"; 
} 

das heißt das Problem ist nicht Ihre regex, ist es, dass Sie @lines jedes Mal durch die Schleife sind überschrieben werden.

+1

Ich habe die Angewohnheit, die Variablen in dem Bereich zu deklarieren, in dem ich sie haben möchte. Hier würde ich "meine @lines;" vor der While-Schleife. Ich denke, dass die fehlende Erklärung von "use strict; use warnings;" – Svante

1

Wie Chaos darauf hingewiesen, sollten Sie auf das Array drücken, nicht überschreiben, aber Ihre Regex ist auch seltsam. Es scheint, dass Sie tun möchten:

/[ ,;:\t\r\n][\t\r\n\s]+/ 

Aber ich denke, dass dies auch funktioniert:

/[,;:\s]+/ 
+0

Ja, es ist nicht die gesündeste Regex aller Zeiten. – chaos

1

Chaos korrekt ist. Wenn Sie die Textdatei öffnen und im selben Programm erneut verarbeiten möchten, vergessen Sie nicht, das Array zu löschen.

@lines =();