Gerd: Regulärer Ausdruck

Hallo,
gibt es eine Möglichkeit über reguläre Ausdrücke Strings zu finden, die genau
n aufeinanderfolgende Zeichen "z" enthalten?
Wenn es sich um feste Werte n und z handeln würde, würde ich es mit meinen bescheidenen Kenntnissen schaffen, aber so?
Die Werte n und z stehen jeweils in Perl-Variablen $n bzw $z.
Falls obiges möglich, ist dann die Ersetzung durch    e i n    in $e stehendes Zeichen möglich.

Gruß
Gerd

  1. Hallo,
    gibt es eine Möglichkeit über reguläre Ausdrücke Strings zu finden, die genau
    n aufeinanderfolgende Zeichen "z" enthalten?
    Wenn es sich um feste Werte n und z handeln würde, würde ich es mit meinen bescheidenen Kenntnissen schaffen, aber so?
    Die Werte n und z stehen jeweils in Perl-Variablen $n bzw $z.
    Falls obiges möglich, ist dann die Ersetzung durch    e i n    in $e stehendes Zeichen möglich.

    Ein kleines Demo Skript

      
    #!C:/Programme/Perl/bin/perl.exe -w  
    #  
    use strict;  
      
    BEGIN {  
     use CGI::Carp qw(carpout);  
     open(LOG, ">>error.txt")  or  die "Unable to append to error.txt: $!\n";  
     carpout(*LOG);  
    }  
      
      
    my $times = 5;  
    my $pat = qr/(?<!X)X{$times}(?=[^X])/;  
      
    "---XXXXX---" =~ $pat and print "success\n";  
    "---X-XXXXX---" =~ $pat and print "success\n";  
    "---XXXXX-X--" =~ $pat and print "success\n";  
    "---XXXXXXX---" =~ $pat and print "Shit Happens\n";  
      
    sleep(10);  
      
    exit;  
    __END__  
      
      
    
    

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>         ><o(((°>
       <°)))o><                      ><o(((°>o
    1. Danke Beat,
      das muss ich mir erst mal in Ruhe zu Gemüte führen!
      Gruß
      Gerd

    2. Hallo,
      danke, das Skript funktioniert, ich betrachte es mal als Black-Box, da ich den reg. Ausdruck nicht verstehe.
      Allerdings ist eine Bedingung nicht erfüllt:
      Das zu suchende Zeichen "x" sollte auch in einer Variablen stehen.
      Geht dies auch?
      Danke Gerd

      1. Allerdings ist eine Bedingung nicht erfüllt:
        Das zu suchende Zeichen "x" sollte auch in einer Variablen stehen.
        Geht dies auch?

        türlich

        mfg Beat

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>      ><o(((°>
           <°)))o><                      ><o(((°>o
        1. Allerdings ist eine Bedingung nicht erfüllt:
          Das zu suchende Zeichen "x" sollte auch in einer Variablen stehen.
          Geht dies auch?

          türlich

          Hallo,
          willst Du einen Lahmen zum Rennläufer machen?

          Die einzige Idee, die ich hatte:
          Wenn $times im Ausdruck erlaubt ist, so auch $var!

          my $times = 5;
          my $var = "X";
          my $pat = qr/(?<!$var)$var{$times}(?=[^$var])/;

          Funktioniert aber leider nicht.

          Gruß
          Gerd

          1. Hi,

            Wenn $times im Ausdruck erlaubt ist, so auch $var!

            my $pat = qr/(?<!$var)$var{$times}(?=[^$var])/;

            Warum setzt Du dann aber nicht $var, sondern $var ein?

            Funktioniert aber leider nicht.

            Kein Wunder, wenn Du dem $ per \ den Status des "Variablenkennzeichners" wegnimmst ...

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
            1. Hi,

              Wenn $times im Ausdruck erlaubt ist, so auch $var!

              my $pat = qr/(?<!$var)$var{$times}(?=[^$var])/;

              Warum setzt Du dann aber nicht $var, sondern $var ein?

              ... weil es mit $var auch nicht funktionierte!

              Gruß

              1. ... weil es mit $var auch nicht funktionierte!

                Tolle Beschreibung. Welche Art Hilfe erwartest du?

                mfg Beat

                --
                Woran ich arbeite:
                X-Torah
                ><o(((°>     ><o(((°>
                   <°)))o><                      ><o(((°>o
                1. ... weil es mit $var auch nicht funktionierte!

                  Das war die Antwort auf MudGuards Beitrag. Habe gedacht, dass $ maskiert werden müsste, da sonst ja "Ende des Strings".

                  Tolle Beschreibung. Welche Art Hilfe erwartest du?

                  Dass mir jemand einen Tipp gibt, was an folgendem falsch ist.
                  In Deinem Beispiel habe ich X durch $var ersetzt und es kommt wird nicht "success" gemeldet

                  ....
                  my $times = 5;
                  my $var = "X";
                  my $pat = qr/(?<!$var)$var{$times}(?=[^$var])/;
                  "---XXXXX---" =~ $pat and print "success\n";
                  .....

                  Und es kommt der Fehler "global symbol %var requires ....."
                  Ich sehe kein % in meinem Beispiel.

                  Gruß
                  Gerd

                  1. ....
                    my $times = 5;
                    my $var = "X";
                    my $pat = qr/(?<!$var)$var{$times}(?=[^$var])/;

                    my $pat = qr/(?<!$var)${var}{$times}(?=[^$var])/;

                    Der Trick                ^   ^

                    "---XXXXX---" =~ $pat and print "success\n";
                    .....

                    Und es kommt der Fehler "global symbol %var requires ....."
                    Ich sehe kein % in meinem Beispiel.

                    $var{5} kann als Hashelement interpretiert werden.
                    Das kann man in REs vorbeigen mit
                    /${var}{kein_key_mehr}/

                    Hier noch eine überarbeitete Fassung, welche jetzt auch Worte akzeptieren sollte, statt nur einzelne Buchstaben.

                      
                    #!C:/Programme/Perl/bin/perl.exe -w  
                    #  
                    use strict;  
                      
                    BEGIN {  
                     use CGI::Carp qw(carpout);  
                     open(LOG, ">>error.txt")  or  die "Unable to append to error.txt: $!\n";  
                     carpout(*LOG);  
                    }  
                      
                      
                    my $times = 5;  
                      
                    my $var = "X";  
                    my $pat = qr/(?<!$var)${var}{$times}(?!$var)/;  
                      
                    "---XXXXX---" =~ $pat and print "success\n";  
                    "---X-XXXXX---" =~ $pat and print "success\n";  
                    "---XXXXX-X--" =~ $pat and print "success\n";  
                    "---XXXXXXX---" =~ $pat and print "Shit Happens\n";  
                      
                      
                    sleep(10);  
                      
                    exit;  
                    __END__  
                      
                    
                    

                    mfg Beat

                    --
                    Woran ich arbeite:
                    X-Torah
                    ><o(((°>      ><o(((°>
                       <°)))o><                      ><o(((°>o
                    1. my $pat = qr/(?<!$var)${var}{$times}(?=[^$var])/;
                      Der Trick                ^   ^

                      "---XXXXX---" =~ $pat and print "success\n";
                      .....

                      Na ja, auf diesen Trick kann ja ein Neuling nie kommen!
                      Gut dass es das Forum gibt!
                      Deine neue Version werde ich morgen testen.
                      Habe inzwischen versucht, den zweiten Teil des Problems anzugehen:
                      Ersetzen der (im obigen Beispiel 5 X durch Y).
                      Hier mein Versuch:

                      .....
                      $Ersatzext="Y";
                      my $feld="---XXXXX---";
                      $feld = s/(?<!$var)${var}{$times}(?=[^$var])/$1$Ersatztext$2/g;
                      .....
                      $1 und $2 sind aber gar nicht bekannt!?

                      Mittels $pat weiss ich schon gar nicht wie es gehen sollte, denn der reg. Ausdruck lautet
                      s/(?<!$var)${var}{$times}(?=[^$var])/$1$Ersatztext$2/g

                      Ich gebs auf für heute.
                      Hoffe, dass ich morgen oder am Montag noch Unterstützung finde.
                      Gruß
                      Gerd

                      1. Hallo Gerd!

                        Na ja, auf diesen Trick kann ja ein Neuling nie kommen!
                        Gut dass es das Forum gibt!

                        Da spart man zwar die teuren Bücher, doch die sind unersetzlich. Doch Beat kennt Mittel und Wegen, wie man sie auch online lesen kann. Vielleicht gibt es so von »Programmieren mit Perl« oder, um klein anzufangen, »Einführung in Perl« von Randal L. Schwartz eine Online-Version.

                        $feld = s/(?<!$var)${var}{$times}(?=[^$var])/$1$Ersatztext$2/g;
                        .....
                        $1 und $2 sind aber gar nicht bekannt!?

                        Weil solche Konstrukte mit einem Fragezeichen am Anfang nur gruppiert, jedoch nicht gemerkt werden.

                        Hoffe, dass ich morgen oder am Montag noch Unterstützung finde.

                        Aber sicher!

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        All'alba vincerò!
                        1. Na ja, auf diesen Trick kann ja ein Neuling nie kommen!
                          Gut dass es das Forum gibt!

                          Da spart man zwar die teuren Bücher, doch die sind unersetzlich. Doch Beat kennt Mittel und Wegen, wie man sie auch online lesen kann.

                          Also mit FF3 zoom sind google books eindeutig besser lesbar geworden.
                          Oder vielleicht sollte ich sagen. Ich wollte ein Buch (historisches Thema) unbedingt lesen, dass ich extra dafür das FF3 Upgrade vom FF2 vorgezogen habe.

                          mfg Beat

                          --
                          Woran ich arbeite:
                          X-Torah
                          ><o(((°>       ><o(((°>
                             <°)))o><                      ><o(((°>o
                        2. Hallo,

                          $feld =~ s/(?<!$var)${var}{$times}(?=[^$var])/$1$Ersatztext$2/g;
                          .....
                          $1 und $2 sind aber gar nicht bekannt!?

                          Weil solche Konstrukte mit einem Fragezeichen am Anfang nur gruppiert, jedoch nicht gemerkt werden.

                          Hierzu zwei Fragen:
                          1. Wie erhalte ich dann in diesem Falle die Strings vor und nach dem gefundenen Muster?
                          2. Statt $feld = /(?<!X)X{$times}(?=[^X])/;
                             kann man offensichtlich schreiben:
                               my $pat = qr/(?<!X)X{$times}(?=[^X])/;
                               $feld =~ $pat;
                             Wie verhält es sich bei einem Ausdruck der Art "s/....../g"?
                             Wenn ich pragmatisch ran ginge hieße es ja:
                               my $pat = qrs/....../g;
                                 nämlich qr gefolgt von dem reg. Ausdruck.
                                 Das kann aber sicher nicht sein, allerdings
                               my $pat = qr~s/....../g~;
                                 ist es wohl auch nicht.
                          Gibt es da auch wieder einen Trick?
                          Einen erholsamen Sonntag ohne dumme Fragesteller (außer mir) wünsche ich euch.
                          Gerd

                          1. Hallo Gerd!

                            1. Wie erhalte ich dann in diesem Falle die Strings vor und nach dem gefundenen Muster?

                            Es gibt die vordefinierten Variablen Prematch und Postmatch (Link hast Du in  Deinem Posting zu $#name erhalten). Die zu nutzen ist aber eine erhebliche Geschwindigkeitsbremse.

                            1. Statt $feld = /(?<!X)X{$times}(?=[^X])/;

                            hier fehlt die Tilde (~) nach dem =

                            kann man offensichtlich schreiben:
                                 my $pat = qr/(?<!X)X{$times}(?=[^X])/;

                            qr steht für quoted RegExp. Es erlaubt Dir, ein Suchmuster vorher zu definieren mit dem Vorteil, dass es bereits kompiliert wird.

                            qr~s gibt es nicht.

                            BTW: Du solltest Dir die Bücher »Einführung in Perl« und »Programmieren mit Perl« wirklich zulegen. Wenn ich sie selbst nicht immer wieder bräuchte, würde ich sie Dir schicken ;) - Die sind zwar teuer, aber vielleicht kannst Du sie Dir zum Geburtstag schenken lassen, oder zu Weihnahchten, oder machst Überstunden und kaufst sie Dir ;)

                            Viele Grüße aus Frankfurt/Main,
                            Patrick

                            --

                            _ - jenseits vom delirium - _
                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                            Nichts ist unmöglich? Doch!
                            Heute schon gegökt?
                            All'alba vincerò!
                            1. Hallo Patrick!

                              1. Wie erhalte ich dann in diesem Falle die Strings vor und nach dem gefundenen Muster?

                              Es gibt die vordefinierten Variablen Prematch und Postmatch (Link hast Du in  Deinem Posting zu $#name erhalten). Die zu nutzen ist aber eine erhebliche Geschwindigkeitsbremse.

                              Dann ist es vielleicht besser, hier gar keinen regulären Ausdruck zu verwenden, sondern es konventionell mit Schleifen zu realisieren?

                              1. Statt $feld = /(?<!X)X{$times}(?=[^X])/;
                                hier fehlt die Tilde (~) nach dem =

                              Danke, war im Skript vorhanden.

                              BTW: Du solltest Dir die Bücher »Einführung in Perl« und »Programmieren mit Perl« wirklich zulegen.

                              Damit ist es leider nicht getan.
                              Wie Du in einem anderen Beitrag vorhin geschrieben hast, wären für ein gutes Programm viele Komponenten möglich.
                              Von regulären Expressions bräuchte ich aber relativ wenig.
                              Also ein Buch studieren für wenig "Reguläre Expressions", eines für "Templates" eines für CGI (wo auch nur einige Befehle ausreichen) eines für ....
                              Dann dürfte ich erst in einigen Jahren mit der Realisierung anfangen, denn ich habe auch noch einen kleinen Nebenjob.
                              Daher finde ich eigentlich die Hilfe hier ganz toll.
                              Wobei ich gar nicht verlange, wie manchmal gefordert wird, fertige Lösungen vorgesetzt zu bekommen.
                              Tipps wie der zitierte "Trick" reichen meistens aus um weiter zu kommen ebenso Hinweise auf bestimmte Textpassagen,   s o f e r n   der Helfende diese parat hat - er soll ja nicht für den Fragesteller "schmökern".
                              Ein gutes Beispiel war Deine Hilfe

                              http://de.selfhtml.org/perl/sprache/listen.htm#elementzugriff, unter »Beachten Sie«.

                              Ein globaler Verweis auf die Dokumentation hätte da für einen Anfänger nichts gebracht, da die Suche nach $# erfolglos war und er nicht weiß, in welchem Kapitel er suchen soll.

                              Aber zurück zum Thema:
                              »»qr~s gibt es nicht.
                              Man kann also nur Ausdrücke der Form /.../ mit qr klammern und nicht solche der Art s/----/ oder steht diese Möglichkeit in den von dir zitierten Büchern?
                              Gruß
                              Gerd

                              1. Hallo Gerd!

                                BTW: Du solltest Dir die Bücher »Einführung in Perl« und »Programmieren mit Perl« wirklich zulegen.
                                Damit ist es leider nicht getan.
                                Wie Du in einem anderen Beitrag vorhin geschrieben hast, wären für ein gutes Programm viele Komponenten möglich.
                                Von regulären Expressions bräuchte ich aber relativ wenig.
                                Also ein Buch studieren für wenig "Reguläre Expressions",

                                Beide Bücher behandeln die Programmiersprache Perl. Reguläre Ausdrücke sind nur ein Kapitel davon, das man zwar, wenn man es vertiefen will, mit einem weiterem Buch richtig lernen kann, aber zum »nur« Perl-Lernen nicht unbedingt vertiefen muss.

                                Aber »Einführung in Perl« ist ziemlich schnell gelesen, und Du wirst schnell lernen - glaube mir. Ich kann mittlerweile Perlfragen beantworten, die ich vor 2 Jahren noch nicht mal verstanden hätte.

                                eines für "Templates" eines für CGI (wo auch nur einige Befehle ausreichen) eines für ....

                                Die Modul-Dokumentationen sind oft dürftig, das stimmt. Zum CGI-Modul gibt es vielleicht ein Buch (weil es ja unentbehrlich ist). Aber es gibt auch online viele Beispiele. Und darin bräuchtest Dich erst zu vertiefen, wenn Du die Grundlagen verinnerlicht hast.

                                Dann dürfte ich erst in einigen Jahren mit der Realisierung anfangen, denn ich habe auch noch einen kleinen Nebenjob.

                                20mn bis 30mn täglich (Tipp: weniger hier posten, dafür Buch lesen ;))

                                Daher finde ich eigentlich die Hilfe hier ganz toll.

                                Das ist sie auch, klar.

                                Wobei ich gar nicht verlange, wie manchmal gefordert wird, fertige Lösungen vorgesetzt zu bekommen.

                                Das sehe ich und deswegen helfen wir Dir auch gerne.

                                Ein gutes Beispiel war Deine Hilfe

                                Ich verbringe manchmal 10-15mn für eine Antwort. Wenn ich Links finden kann, poste ich diese. Die Zeit brauche ich also nicht zum Tippen, das kann ich relativ gut, sondern zum Suchen ;)

                                »»qr~s gibt es nicht.
                                Man kann also nur Ausdrücke der Form /.../ mit qr klammern und nicht solche der Art s/----/ oder steht diese Möglichkeit in den von dir zitierten Büchern?

                                qr ist ähnlich qw oder qq. Jedesmal, wo Du so was siehst, bedeutet das "quoted".

                                qq ersetzt Doublequotes:

                                $string = "ich bin ein "bärliner""; # hässlich wg. der escape-Zeichen nicht?

                                geht auch so:

                                $string = qq/ich bin ein "bärliner"/;

                                Mit qr definierst Du ein Suchmuster:

                                my $pattern = qr/..../;

                                Das ist erstmal alles, außer das es vorkompiliert wird und später, bei der Tatsächlichen Ersetzung, geht es schneller:

                                my $line = s/$pattern/irgendwas anders/;

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                                All'alba vincerò!
                                1. Hallo Patrick!

                                  Erwischt!

                                  my $line = s/$pattern/irgendwas anders/;

                                  Auch hier fehlt das ~!

                                  Gruß und Dank
                                  Gerd

                                  1. Hallo Gerd!

                                    Erwischt!
                                    Auch hier fehlt das ~!

                                    Jepp! Passiert mir auch oft und dann wundere ich mich, dass nichts passiert :) Zum Glück bringt Perl eine Meldung 'raus!

                                    So... und jetzt muss ich mir langsam anderen Sachen widmen, mein Patenkind ist wieder beim Papa und ich habe wieder die Ruhe!

                                    Viele Grüße aus Frankfurt/Main,
                                    Patrick

                                    --

                                    _ - jenseits vom delirium - _
                                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                    Nichts ist unmöglich? Doch!
                                    Heute schon gegökt?
                                    All'alba vincerò!
                            2. Hallo Patrick!

                              Möchte Dich nicht in Deiner Ruhe stören, erwarte eine mögliche Antwort daher erst ab Montag.

                              Es gibt die vordefinierten Variablen Prematch und Postmatch (Link hast Du in  Deinem Posting zu $#name erhalten). Die zu nutzen ist aber eine erhebliche Geschwindigkeitsbremse.

                              Trotz der Warnung habe ich es einmal damit versucht - und es funktioniert

                              fast!

                                
                              my $times = 5;  
                              my $var = "XYZ";  
                              my $ersatz = "123456";  
                              my $pat = qr/(?<!$var)(?:$var){$times}(?!$var)/;  
                              my $text = "aaaXYZXYZXYZXYZXYZbbb";  
                              $text =~ s/$pat/$`$ersatz$'/g;  
                              print "Text-neu: $text<br>";     # <=== Text-neu: aaaaaa123456bbbbbb  
                              print "*$`* *$'*<br>";           # <=== *aaa* *bbb*  
                              
                              

                              Das heißt $` und $' sind richtig gefüllt.
                              Warum aber erscheint deren Inhalt in der Ersetzung doppelt?

                              Vermutlich mein letzter Beitrag für heute!
                              Gruß
                              Gerd

                              1. Es gibt die vordefinierten Variablen Prematch und Postmatch (Link hast Du in  Deinem Posting zu $#name erhalten). Die zu nutzen ist aber eine erhebliche Geschwindigkeitsbremse.

                                Trotz der Warnung habe ich es einmal damit versucht - und es funktioniert
                                fast!

                                my $times = 5;
                                my $var = "XYZ";
                                my $ersatz = "123456";
                                my $pat = qr/(?<!$var)(?:$var){$times}(?!$var)/;
                                my $text = "aaaXYZXYZXYZXYZXYZbbb";
                                $text =~ s/$pat/$`$ersatz$'/g;

                                $text =~ s/$pat/$ersatz/g;
                                reicht vollkommen. Pre und Postmatch sind nicht notwendig.

                                print "Text-neu: $text<br>";     # <=== Text-neu: aaaaaa123456bbbbbb
                                print "$` $'<br>";           # <=== aaa bbb

                                
                                >   
                                >   
                                > Das heißt $` und $' sind richtig gefüllt.  
                                  
                                Doch sie sind. Aber die Verdoppelung geschieht durch eine unnötige Anwendung.  
                                  
                                  
                                Teste mal diesen string  
                                my $text = "-----123XYZXYZXYZXYZXYZ123-----";  
                                  
                                Dann siehst du besser, was geschieht.  
                                  
                                mfg Beat
                                
                                -- 
                                Woran ich arbeite:  
                                [X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)  
                                   <°)))o><                      ><o(((°>o  
                                
                                
                                1. Hallo,
                                  trotz meines Versprechens, Euch jetzt wahrscheinlich in Ruhe zu lassen-
                                  hier bin ich noch einmal.

                                  $text =~ s/$pat/$ersatz/g;
                                  reicht vollkommen. Pre und Postmatch sind nicht notwendig.

                                  Es funktioniert!
                                  Ich staune Bauklötze - Ein Wunderwerk, die reg. Ausdrücke und voller Geheimnisse.
                                  Danke, dass Ihr einige gelüftet habt.
                                  Schönen Sonntag noch
                                  Gerd

                              2. Hallo Gerd!

                                Ist schon gelöst, aber:

                                $text =~ s/$pat/$`$ersatz$'/g;                   ^        ^

                                Du ersetzt das Muster durch PREMATCH.Ersetzungsmuster.POSTMATCH.

                                Warum aber erscheint deren Inhalt in der Ersetzung doppelt?

                                Eben darum ;)

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                                All'alba vincerò!
                                1. Hallo Patrick und Beat!

                                  Da hatte ich ja einen kompletten Blackout!

                                  Du ersetzt das Muster durch PREMATCH.Ersetzungsmuster.POSTMATCH.

                                  Ich hatte entgegen bisheriger Erfahrung gedacht "Wenn das Suchmuster gefunden wird, wir der Gesamtstring - nicht das Suchmuster(!) - ersetzt durch das Ersetzungsmuster! Wie blöd, ne?
                                  War wohl zu lange am PC gesessen (sagt meine Frau auch immer)!
                                  Danke nochmals
                                  Gerd

                    2. Hallo beat,

                      Hier noch eine überarbeitete Fassung, welche jetzt auch Worte akzeptieren sollte, statt nur einzelne Buchstaben.

                      ich habe diese Version getestet mit:
                      ......
                      my $times = 5;
                      my $var = "XYZ";     <======
                      my $pat = qr/(?<!$var)${var}{$times}(?!$var)/;
                      "---XYZXYZXYZXYZXYZ---" =~ $pat and print "success\n";
                      "---XYZXYZXYZXYZ---" =~ $pat and print "success\n";
                      "---XYZXYZXYZXYZXYZXYZ---" =~ $pat and print "success\n";
                      ....
                      Dabei kam in allen drei Fällen keine success-Meldung.
                      Habe ich einen Fehler gemacht oder liegt es am Skript?
                      Gruß
                      Gerd

                      1. Hier noch eine überarbeitete Fassung, welche jetzt auch Worte akzeptieren sollte, statt nur einzelne Buchstaben.

                        ich habe diese Version getestet mit:
                        ......
                        my $times = 5;
                        my $var = "XYZ";     <======
                        my $pat = qr/(?<!$var)${var}{$times}(?!$var)/;

                        hier fehlt noch eine Klammer:

                        my $pat = qr/(?<!$var)(?:$var){$times}(?!$var)/;

                        sonst wird {$times} ja nur auf das letzte Zeichen des Wortes angewendet.

                        mfg Beat

                        --
                        Woran ich arbeite:
                        X-Torah
                           <°)))o><                      ><o(((°>o
                        1. hier fehlt noch eine Klammer:

                          my $pat = qr/(?<!$var)(?:$var){$times}(?!$var)/;

                          Kleine Ursache, große Wirkung!
                          Diese kurze Schreibweise ist doch äußerst gewöhnungsbedürftig!
                          Das lerne ich nie!
                          Danke
                          Gerd

                  2. Hallo Gerd!

                    Und es kommt der Fehler "global symbol %var requires ....."
                    Ich sehe kein % in meinem Beispiel.

                    Du möchtest Dich mit dem Stichwort »Autovivification« beschäfigen (anstatt Demo-Gästebücher zu testen) ;)

                    Viele Grüße aus Frankfurt/Main,
                    Patrick

                    --

                    _ - jenseits vom delirium - _
                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                    Nichts ist unmöglich? Doch!
                    Heute schon gegökt?
                    All'alba vincerò!
                    1. Und es kommt der Fehler "global symbol %var requires ....."
                      Ich sehe kein % in meinem Beispiel.

                      Du möchtest Dich mit dem Stichwort »Autovivification« beschäfigen (anstatt Demo-Gästebücher zu testen) ;)

                      Die Autovivication findet aber in diesem Falle nicht statt. Perl generiert im strict mode höchstens keys für deklarierte Hashes.
                      Im Falle der RE hätte Perl auch weiter denken können, und statt einem Hashelement die effektiv bestehende Scalar Variable entdecken können.
                      Das derzeitige Verhalten erachte ich als Feature, das dem "do what I mean" für einmal nicht entgegen kommt.

                      mfg Beat

                      --
                      Woran ich arbeite:
                      X-Torah
                      ><o(((°>       ><o(((°>
                         <°)))o><                      ><o(((°>o
                      1. Hallo Beat!

                        Die Autovivication findet aber in diesem Falle nicht statt. Perl generiert im strict mode höchstens keys für deklarierte Hashes.

                        Ja, Perl will hier »autovivifizieren«, doch im strict-Mode muss alles mit »my« deklariert werden, was hier ja nicht der Fall ist -> Abbruch.

                        Im Falle der RE hätte Perl auch weiter denken können, und statt einem Hashelement die effektiv bestehende Scalar Variable entdecken können.

                        Schlag das doch für Perl 12 vor ;) Spaß beiseite, ich verstehe, wie Du es meinst.

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        All'alba vincerò!
                    2. Hallo Patrick,
                      lass mich doch bitte testen, was ich will.
                      Dein Gästebuch wurde ja angepriesen wie - ich weiß nicht was - und Du rufst ja dazu auf, es zu testen.
                      Wenn dann die trivialsten Dinge nicht funktionieren
                      ("R a d e t z k i m a r s c h " wird abgewiesen, weil es ein böses Wort enthält), ist das natürlich eine Herausforderung, es weiter zu testen um es dann selbst besser zu machen!
                      Im übrigen hat diese Belehrung wohl nichts mit meinem Thema hier zu tun.
                      Also "Rote Karte", wie Ihr sie auch immer verteilt!
                      Und anscheinend gilt auch im SELFHTML "Big brother is watching you"!
                      Wie anders könntest Du feststellen, dass ich in Dein Gästebuch geschrieben habe.
                      Also nicht mehr über Herrn Schäuble meckern, denn wer im Glashaus sitzt ....

                      Für die anderen - konstruktiven - Beiträge, mein Dank.
                      Gruß
                      Gerd

                      1. Hallo Gerd!

                        lass mich doch bitte testen, was ich will.

                        Klar. Fragen kannst Du mich allerdings direkt.

                        Dein Gästebuch wurde ja angepriesen wie - ich weiß nicht was -

                        Ja? Siechfred hat es ein oder zwei Mal erwähnt, und ja: in meinen Beiträgen ist es verlinkt (Signatur und URL oben)... na und? Soll ich die Fotos des nächsten FKK Urlaubs zeigen bzw. in der Signatur verlinken [*] anstatt einer Arbeit, die vielleicht nicht perfekt ist, aber auf die ich irgendwie stolz bin?

                        [*] Einige würden ja sagen, aber viel zu sehen gibt es (von mir) nicht ;)

                        Wenn dann die trivialsten Dinge nicht funktionieren
                        ("R a d e t z k i m a r s c h " wird abgewiesen, weil es ein böses Wort enthält), ist das natürlich eine Herausforderung, es weiter zu testen um es dann selbst besser zu machen!

                        Du testest doch gerade Regular Expressions. Die Cusswords werden mit Wortgrenzen behandelt. *rsch geht nicht durch, Marsch oder Parademarsch oder Radetzkimarsch wird akzeptiert. Frage: Wo soll ich bei Sperrschrift auf Wortgrenzen prüfen? Außerdem ist dieser Teil des GB noch vom Leif M. Wright (steht ganz oben in ugb.pl: inspiriert von Leif M. Wright, und Reste seines Code benutze ich immer noch). Hätte ich nur die Lust dazu, würde ich mit dem, was ich mir die letzten zwei Jahre angeeignet habe, einen ganz anderen Ansatz verfolgen, Module einbinden, und und und... Aber das GB läuft bis jetzt zufriedenstellend, und ich erhalte wenige Anfragen, dass dies und das nicht klappt.

                        Im übrigen hat diese Belehrung wohl nichts mit meinem Thema hier zu tun.

                        Da gebe ich Dir recht, war unfair.

                        Zu dem anderen Vorwurf: Ich habe nur ein gutes Zahlen-Gedächtnis und werte mehrmals am Tag meine Logfiles nach. Und das sollte jeder, der interaktive Inhalte anbietet, sonst hat man Postings wie dieses hier am laufenden Meter.

                        Für die anderen - konstruktiven - Beiträge, mein Dank.

                        Gerne geschehen. Das Thema interessiert mich nun mal, und wenn ich etwas von meinem noch nicht ausreichenden Wissen vermitteln kann - immer wieder gerne!

                        Viele Grüße aus Frankfurt/Main,
                        Patrick

                        --

                        _ - jenseits vom delirium - _
                        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                        Nichts ist unmöglich? Doch!
                        Heute schon gegökt?
                        All'alba vincerò!
                        1. Hallo Patrick!

                          lass mich doch bitte testen, was ich will.

                          Klar. Fragen kannst Du mich allerdings direkt.

                          Wenn ich immer fragen müsste, ob dies oder jenes abgefangen wird, wäre dies sowohl für Dich als auch für mich sehr aufwendig.
                          Zum Testen hast Du ja freundlicherweise die Testversion bereitgestellt.

                          Du testest doch gerade Regular Expressions. Die Cusswords werden mit Wortgrenzen behandelt. *rsch geht nicht durch, Marsch oder Parademarsch oder Radetzkimarsch wird akzeptiert. Frage: Wo soll ich bei Sperrschrift auf Wortgrenzen prüfen?

                          Gerade deswegen beschäftige ich mich mit reg. Expr.
                          Ich würde als Wortgrenzen das / die Sonderzeichen interpretieren, die von den andern abweichen.
                          Beispiele:
                          B*a*n*a*n*e*s*c*h*m .... ist so als ein Wort zu interpretieren,
                          B*a*n*a*n*e#s*c*h*m .... als zwei Worte
                          B  a  n  a  n  e  s  c  h m .... ist so als ein Wort zu interpretieren,
                          B  a  n  a  n  e    s  c  h  m ...   als zwei
                          Ausdrücke der Art B#a*n*a+n#e, wo sich Sonderzeichen ständig abwechseln werden damit nicht erfasst, brauchen es aber auch nicht, denn die Worte sind dann ohnehin kaum verständlich.
                          Mich hat einfach Dein GB herausgefordert, die Bad-word-Prüfung noch ein wenig voranzutreiben.

                          Zu dem anderen Vorwurf: Ich habe nur ein gutes Zahlen-Gedächtnis und werte mehrmals am Tag meine Logfiles nach.

                          Und dort stehen auch Selfhtml-Einträge? Das riecht nach Bespitzelung!

                          Und das sollte jeder, der interaktive Inhalte anbietet, sonst hat man Postings wie dieses hier am laufenden Meter.

                          Das ist aber doch nicht von mir!

                          Gruß
                          Gerd

                          1. Hallo Gerd!

                            Wenn ich immer fragen müsste, ob dies oder jenes abgefangen wird, wäre dies sowohl für Dich als auch für mich sehr aufwendig.
                            Zum Testen hast Du ja freundlicherweise die Testversion bereitgestellt.

                            Ich rufe meine Mails mehrmals am Tag ab, und mir ist eine Anfrage via E-Mail lieber. Wenn Du das GB »studierst«, so wie es den Anschein hat: ich glaube, ich habe Dir vor einem halben Jahr schon gesagt, dass es kein guter Einstieg in Perl ist - da wird mir vor allem Struppi beistimmen ;)

                            Aber wenn Du schon den Code hast, hast Du es auch installiert? Wenn nicht, warum nicht? Und warum testest Du das dann nicht bei Dir? Wenn Du was nicht verstehst oder Dir was nicht gefällt, kannst Du mich immer noch anmailen oder meinetwegen hier posten (wobei ich den GB-Support ungerne ins Forum verlagern möchte).

                            Mich hat einfach Dein GB herausgefordert, die Bad-word-Prüfung noch ein wenig voranzutreiben.

                            Das finde ich toll, und ich hoffe sehr, dass Du mir das dann zeigst, wenn Du's fertig hast. ;)

                            Ich mach am GB außer Kleinkorrekturen nicht viel, denn - wie gesagt - im Grunde müsste es komplett neu geschrieben werden.

                            und werte mehrmals am Tag meine Logfiles nach.
                            Und dort stehen auch Selfhtml-Einträge? Das riecht nach Bespitzelung!

                            Schau mal: ich habe eine Grafik in meiner Signatur. Die verursacht einen Logfile-Eintrag beim jedem Aufruf eines Postings von mir. Und in meiner täglichen Logfile-Auswertung werden die Requests gruppiert (hier ein Beispiel mit gefakten IPs, das ich schon mal hier gepostet hatte: http://www.atomic-eggs.com/z_testdir/files/access_an.pl).

                            Und das sollte jeder, der interaktive Inhalte anbietet, sonst hat man Postings wie dieses hier am laufenden Meter.
                            Das ist aber doch nicht von mir!

                            Ich weiß, aber das war nur ein Hinweis ;)

                            Viele Grüße aus Frankfurt/Main,
                            Patrick

                            --

                            _ - jenseits vom delirium - _
                            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                            Nichts ist unmöglich? Doch!
                            Heute schon gegökt?
                            All'alba vincerò!
                            1. Hallo Patrick!

                              Aber wenn Du schon den Code hast, hast Du es auch installiert? Wenn nicht, warum nicht? Und warum testest Du das dann nicht bei Dir?

                              Da Du selbst geschrieben hast, dass Du es heute anders machen würdest,
                              Zitat:

                              Ich mach am GB außer Kleinkorrekturen nicht viel, denn - wie gesagt - im Grunde müsste es komplett neu geschrieben werden.

                              Ende Zitat
                              versuche ich, das GB ganz neu zu schreiben.
                              Um zu sehen, welche Prüfungen sinnvoll sind - und die ich ggf. übernehmen kann, habe ich Dein GB getestet.
                              Vielleicht installiere ich Dein GB doch noch bei mir. Habe bisher nur den Aufwand gescheut.

                              Gruß
                              Gerd

                              1. Hallo Gerd!

                                versuche ich, das GB ganz neu zu schreiben.

                                Dann mach es aber gleich richtig, schmeiß mein Code zwar nicht in die Tonne aber erstmal beiseite, und fang richtig neu an, d.h. mit einem leeren Editorfenster.

                                Benutze:

                                • HTML::Templates für die HTML-Templates,
                                • die passenden Funktionen des CGI-Moduls,
                                • für web-lib.pl und config.pl muss das Konzept neu erdacht werden (Du kannst mein Modul Date::Today für die Datumsausgabe nutzen)
                                • arbeite gleich sauber und objektorientiert.

                                Dann wirst Du feststellen, dass Du von ugb.pl im Grunde gar nichts zu übernehmen brauchst ;)

                                Und wenn Du fertig bist, zeig uns das hier, ok?

                                Viele Grüße aus Frankfurt/Main,
                                Patrick

                                --

                                _ - jenseits vom delirium - _
                                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                Nichts ist unmöglich? Doch!
                                Heute schon gegökt?
                                All'alba vincerò!
                                1. Hallo Patrick,

                                  Dann mach es aber gleich richtig, ...
                                  Benutze:

                                  .....

                                  Und wenn Du fertig bist, zeig uns das hier, ok?

                                  OK,
                                  aber das dauert dann Jahre, bis ich die ganzen Grundlagen intus habe - wie Du siehst, schlage ich mich noch mit regulären Ausdrücken herum!
                                  Ob bis dahin ein Gästebuch überhaupt noch gefragt ist?
                                  Heute wird doch gebloggt.
                                  Ich betrachte die Entwicklung für mich als Hirnjogging!
                                  Gruß
                                  Gerd

                                  1. Hallo Gerd!

                                    Ob bis dahin ein Gästebuch überhaupt noch gefragt ist?
                                    Heute wird doch gebloggt.

                                    Ach ich denke schon. Gebloggt wird doch schon bereits seit Jahren, dennoch wird immer wieder nach Gästebüchern gefragt.

                                    Ich betrachte die Entwicklung für mich als Hirnjogging!

                                    Ja, und eine gute Übung, das gelernte in die Praxis umzusetzen ist es allemal!

                                    Viele Grüße aus Frankfurt/Main,
                                    Patrick

                                    --

                                    _ - jenseits vom delirium - _
                                    [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                                    Nichts ist unmöglich? Doch!
                                    Heute schon gegökt?
                                    All'alba vincerò!
                            2. Wenn Du das GB »studierst«, so wie es den Anschein hat: ich glaube, ich habe Dir vor einem halben Jahr schon gesagt, dass es kein guter Einstieg in Perl ist - da wird mir vor allem Struppi beistimmen ;)

                              Oder zustimmen ;-)

                              Struppi.