Hi,
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
> -------------------------------
Diese Ausgabe kann nicht von obigem Script stammen, denn laut Script müßten an verschiedenen Stellen <br> ausgegeben werden.
> 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 ){`{:.language-perl}
> -------------------------------
> neu: a
> Liste: a
>
> doppelt: a
> neu: a
> Liste: a
>
> a
>
> doppelt: a
> -------------------------------
Weil Du nach einem Match die Liste nicht neu initialisierst (next). Und der Regex immer der gleiche ist.
Beim ersten Durchlauf ist $liste leer, es wird nicht gematcht, $liste wird gesetzt.
Beim zweiten Durchlauf wird gematcht ($liste ist ja auf $check gesetzt), $liste wird nicht geändert wegen next.
Beim dritten Durchlauf wird derselbe Regex \*) auf $liste angewendet - es gibt aber nur ein Vorkommen von $check in $liste, das wurde aber schon im zweiten Durchlauf "verbraucht". $liste wird wieder neu gesetzt.
Beim vierten Durchlauf wird wieder gematcht (neue $liste, neues $glück).
\*) 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.
Du könntest das Setzen von $check auch vor die Schleife setzen ...
> Ä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
> -------------------------------
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 ...
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.