MudGuard: RegEx-Frage zu "'\n'" und /g

Beitrag lesen

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.