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

Beitrag lesen

Hallo Andreas,

*) auch wenn der Regex neu gesetzt wird, erkennt das der Regex-Compiler und erzeugt ihn m.W. nicht neu, es wird also nicht nach dem ersten Match gesucht.

Ok, Konzept verstanden! Das ist beeindruckend: dann ist 'g' so eine Art 'Elefantengedächtnis-Flag'?! Je tiefer ich in die Materie einsteige, desto mehr Ehrfurcht habe ich vor RegEx. Als Gott die Welt erschuf, nahm er einen regulären Ausdruck - und war fertig. Echt mächtig, die kleinen Dinger!

Du könntest das Setzen von $check auch vor die Schleife setzen ...

ja, so wie es jetzt aussieht schon. In dem ursprünglichen Script ändert sich $check innerhalb der foreach-Schleife.

In Perl werden Strings in "" und '' unterschiedlich behandelt, was escapte Zeichen und Variablenexpansion betrifft.
"a\n" sind 2 Zeichen, 'a\n' sind 3.
Wenn 'a\n' im Regex // eingesetzt wird, hat der \ allerdings wieder seine Sonderbedeutung im Regex ...

grundsätzlich weiß ich um die unterschiedlichen Behandlungen von " und ', nur in diesem Fall war es mir noch nicht klar. Ich habe ja oben _und_ unten dasselbe Quoting verwendet. Wenn ich das jetzt richtig verstanden habe, wirken die // vom Regex analog zu "". Und wenn dann 'a\n' reinkommt, wird daraus trotzdem "a\n". Also quotemeta vorschalten und alles ist gut?:

Korrekt arbeitet diese Version:

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

Erhellte Grüße
JOhnnY