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