Johnny B.: RegEx-Frage zu "'\n'" und /g

Beitrag lesen

Hallo geehrtes Forum,

hier passieren merkwürdige Dinge, die ich mir nicht erklären kann. Die Aufgabenstellung ist eigentlich simpel: es gibt mehrere Durchläufe, bei denen die doppelten Vorkommen von $check nicht abgearbeitet werden sollen. Alle neuen Versionen von $check werden in $liste gesammelt für spätere Verwendung und Speicherung in einer Datenbank (mySQL). Dabei hat mich das automatisch Hinzufügen von \r an \n zu \r\n beim Speichern durch mySQL bereits bös verwirrt. Nachdem ich jedoch dieses Verhalten aufgefangen hatte, lief es trotzdem nicht so wie gedacht. Nach langem Ausprobieren habe ich diesen Teil hier extrahiert. Es hat also mit der DB gar nichts zu tun:

my $liste;  
my ( @durchlauf ) = ( 1,2,3,4 );  
foreach ( @durchlauf ) {  
    my $check = 'a'."\n";  
    if ( $liste =~ /$check/sm ){  
        print '<br>doppelt: '.$check;  
        next;  
    }  
    $liste .= $check."\n";  
    print '<br>neu: '.$check;  
    print '<br>Liste: '.$liste;  
}

In dieser Form tut es, was es soll. Ausgabe:
-------------------------------
neu: a
Liste: a

doppelt: a
doppelt: a
doppelt: a
-------------------------------

Wenn ich das Global-Flag /g hinzufüge, (wie ich es anfangs hatte), kommt diese mich völlig verwirrende Ausgabe. Wieso matcht er 'a' nicht mehr beim dritten Durchlauf? Und danach wieder doch? WTF?

if ( $liste =~ /$check/gsm ){
-------------------------------
neu: a
Liste: a

doppelt: a
neu: a
Liste: a

a

doppelt: a
-------------------------------

Ändere ich nun die Anführungszeichen bei beiden \n von doppelt " auf einfach ', erscheint das hier:
-------------------------------
neu: a\n
Liste: a\n\n
neu: a\n
Liste: a\n\na\n\n
neu: a\n
Liste: a\n\na\n\na\n\n
neu: a\n
Liste: a\n\na\n\na\n\na\n\n
-------------------------------

Auch hier verstehe ich nicht, wieso der RegEx 'a\n' nicht matcht, wo es doch genauso in $liste steht. An dieser Ausgabe ändert sich ohne das /g-Flag nichts.

Kann mir hier jemand Licht ins Dunkel der Verwirrung bringen?

Verstörte Grüße
JOhnnY