Torwächter: Verdammt ich dreh noch durch - Profie benötigt

Hallo zusammen,

ich steh vorm nächsten Problem, was scheinbar unlösbar zu sein scheint:

-ich habe einen Text
-in diesem Text sind 3 Nummern

der Text steht in >einer< Zeile, daher ist ein foreach nicht möglich.

ich kann extrahieren mit:  $text =~ s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/link$1und$2/g;

mein Problem:

ich muss eine Überprüfung der letzten Ziffer durchführen (mit "if...")
aber wie ? in einer Zeile 3 mal if ???

Wer das Problem lösen kann bekommt meinen Respekt !

Greetings
Torwächter

  1. hi!

    Versuch's mal mit einer verständlichen Formulierung deiner Frage,
    dann kann dir vielleicht auch jemand helfen.

    Du hast in einem Text drei Nummern, der auf folgenden regulären
    Ausdruck passt:

    /(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/

    Diesen Teil im Text ersetzt du durch irgendwas anderes, wobei die
    ersten beiden Nummern mitverwendet werden. Soweit klar. Was hast du
    jetzt mit der dritten Nummer vor? Und woran scheitert die Umsetzung?

    bye, Frank!

    1. Hallo,

      also, ich habe eine Zeile mit Text:
      $text=qq~aaaaaaaaaaaaaaaaaCODE1aaaaaaaaaaaaaCODE2aaaaaaaaaCODE3aaaaaa~;

      wie kann ich in dieser Zeile die Codes (alle) durch BBBBB ersetzen:
      $text=~s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/BBBBB/g;
      Funzt.

      ABER

      ich kann diesen Befehl nicht benutzen, da ich bei jedem Code (mehr als nur 3) eine if Anweisung durchführen muss:
      $text=~s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/if($4 ne "X"){...}/g;
      Funzt natürlich so nicht.

      D.H.

      Ich muss also irgendeine Schleife benutzen, die diese Zeile nach dem Suchmuster (\d)-(\d{3})-(\d{5})-([a-zA-Z0-9]) durchsucht und wenn eins gefunden ein If Befehlt ausführt UND DANN WEITERSUCHT.

      Greetings
      Torwächter

      PS: sorry für die letzte Formulierung, ich hab schon beinahe geschlafen :)

      1. Hallo!

        also, ich habe eine Zeile mit Text:
        $text=qq~aaaaaaaaaaaaaaaaaCODE1aaaaaaaaaaaaaCODE2aaaaaaaaaCODE3aaaaaa~;

        wie kann ich in dieser Zeile die Codes (alle) durch BBBBB ersetzen:
        $text=~s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/BBBBB/g;
        Funzt.

        ABER

        ich kann diesen Befehl nicht benutzen, da ich bei jedem Code (mehr als nur 3) eine if Anweisung durchführen muss:
        $text=~s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/if($4 ne "X"){...}/g;
        Funzt natürlich so nicht.

        Aha, ich glaube hier ist ein PERL-Experte wie ich von Nöten ;-)

        Ich muss also irgendeine Schleife benutzen, die diese Zeile nach dem Suchmuster (\d)-(\d{3})-(\d{5})-([a-zA-Z0-9]) durchsucht und wenn eins gefunden ein If Befehlt ausführt UND DANN WEITERSUCHT.

        leider finde ich gerade mein PERL Buch nicht dann könnte ich etwas mehr sagen, aber ist es so das Du die genaue Anzahl der vorkommenden Codes kennst? Wenn ja kannst Du das schon wie oben machen, halt nicht mit s///, sondern lediglich m//(glaube ich) zuminest nur "finden". In PERL kann man doch die Treffer des Regulären Ausdrucks auch im PERL Code danach verwenden, oder? Dann mach doch erst da die if-Abfragen und ersetze was Du willst!

        In PHP gibt es mit preg_match() die Möglichkeit, alle Treffer in einen Array zu schreiben, der natürlich sehr angenehm auszuwerten ist, evtl geht das auch irgendwie in PERL?

        Grüße
        Andreas

        1. Hi,

          das Problem ist, die Anzahl der Nummern ist pro Zeile unterschiedlich.
          Das Problem ist auch nicht, dass ich die Nummern nicht finde, sondern diese zu überprüfen:

          while($mangaprint =~ /(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/)
          {
             if ($1 ne "x")
             {
                Anweisung();
             }
             else
             {
                Abweisung();
             }
          }

          Ich muss es irgendwie schaffen, dass alle Nummern (Codes) gesucht werden und für JEDEN eine solche If-Überprüfung gestartet wird.

          Greetings
          Torwächter

          1. Hallo

            Hi,

            das Problem ist, die Anzahl der Nummern ist pro Zeile unterschiedlich.

            Im OP hast Du von einer einzigen Zeile gesprochen. Jetzt sind es schon mehrere. Sind es nun mehrere Zeilen in einer einzigen Variable, oder mehrere Zeilen auf mehrere Variablen verteilt, oder doch nur eine Zeile in einer Variablen mit mehreren Blöcken, auf die der Ausdruck passt?

            Das Problem ist auch nicht, dass ich die Nummern nicht finde, sondern diese zu überprüfen:

            while($mangaprint =~ /(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/)

            Das kann nur funktionieren, wenn Du den modifier /g verwendest, der alle Vorkommen des Suchmusters finden lässt.
            Bist Du Dir sicher, daß der Ausdruck das findet, was Du suchst. So wie oben, können durchaus die "Code"-blöcke ineinander übergreifen.

            {
               if ($1 ne "x")
               {
                  Anweisung();
               }
               else
               {
                  Abweisung();
               }
            }

            Ich muss es irgendwie schaffen, dass alle Nummern (Codes) gesucht werden und für JEDEN eine solche If-Überprüfung gestartet wird.

            Wo ist denn jetzt das Problem? Du hast bei einem Treffer die Codes in den Variablen $1, $2, $3 und $4. Was Du damit machst bleibt Dir überlassen.
            Vielleicht wäre es sinnvoll, Dein Problem nicht so stark zu reduzieren, und mal eine Zeichenkette aus dem realen Leben vorzustellen. Evtl. wäre es imho auch sinnvoll, den _echten_ Code(-Auszug) auf einer Website zu veröffentlichen (einfaches Syntaxhighlighting kannst Du mit http://www.dynamic-web-development.de/pub/perl/pl2.html hinzufügen [oder vim verwenden ;)])

            Gruß Alex
            --
            http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart

            1. Hallo,

              imo sind es ca 100 Zeilen, aber daraus wird schon eine Zeile gefiltert, daher nur eine Zeile :)

              Toll, nun hab ich alles schon ausprobiert und nachdem du geantwortet hast funzt es :-?)
              (ich hatte es auch schon mit "g" versucht, aber da hatt es noch keine Wirkung gezeigt.

              Danke an euch alle.

              Greetings
              Torwächter

      2. Hallo,

        Funzt.

        Das Wort kenne ich nicht. Was soll das bedeuten?

        ich kann diesen Befehl nicht benutzen, da ich bei jedem Code (mehr als nur 3)
        eine if Anweisung durchführen muss:
        $text=~s/(\d)-(\d{3})-(\d{5})-([a-zA-Z0-9])/if($4 ne "X"){...}/g;
        Funzt natürlich so nicht.

        S.O.
        Wenn du meinst, dass der Befehl oben nicht funktioniert, dann hast du Recht. Da
        fehlt der 'e'-Modifier. Lies bitte

        perldoc perlre

        fuer mehr Infos.

        Gruesse,
         CK

  2. morgens ...

    mein Problem: ich muss eine Überprüfung der letzten Ziffer durchführen (mit "if...")

    ich bin mir nicht ganz sicher, ob das, was ich in deinem Code als "letzte Ziffer" zur Zeit lese, wirklich die Stelle ist, die du meinst. Aber:
    wenn man vor einer solchen Aufgabe steht, ist es immer mal wert, auszuprobieren, ib diese "letzte Ziffer" nicht innerhalb der Subroutine in Form einer Variablen überprüft werden kann. In deinem konkreten Code:
    &letzte_Ziffer = if (link$1und$2 == irgendwas {
      na nun mach mal
    } else {
      nee, das hab ich nicht gemeint, mach was Sinnvolles
    }

    grüßchens

    Christoph S.

  3. Hallo!

    Nicht mal Profi richtig schreiben koennen aber RegExp konstruieren wollen.
    Selten so gelacht

    Rechtschreibkorrektor