Tom: zusätzliche Rückgabe der Trefferposition bei Matching

Hi,

ist es möglich, die Position sprich Zeile eines Treffers nach einem Match zu finden?
Ich lese z.B. einen Text aus einer Datei und suche per =~ nach einem Detail.
Ist es möglich, eine Liste mit Zeilennummern oder auch Spalten und Zeilennummer zurückzugeben, wo Treffer zu verzeichnen waren?

Danke!

Tom

  1. Hallo Tom,

    mit der Spezialvariable $. erhälst Du die Anzahl der Zeilen, die aus einem Dateihandle eingelesen wurden.
    Ansonsten kannst Du ja einen Zähler mitlaufen lassen, für jede Zeile die Du einliest. Einen Zähler wirst Du wahrscheinlich für das ermitteln der Spalte auf jeden Fall benötigen.

    greets
    myMojito

    --
    -------------------------------------------
    Mode ist eine Variable, Stil eine Konstante
    1. Hallo Tom,

      mit der Spezialvariable $. erhälst Du die Anzahl der Zeilen, die aus einem Dateihandle eingelesen wurden.
      Ansonsten kannst Du ja einen Zähler mitlaufen lassen, für jede Zeile die Du einliest. Einen Zähler wirst Du wahrscheinlich für das ermitteln der Spalte auf jeden Fall benötigen.

      Du hast das Problem nicht verstanden.
      Ich habe eine komplette Datei in $datei.
      Jetzt suche ich nach z.B. dem Wort "Hugo":

      $datei =~ s/hugo/igs;

      Ich will wissen, falls es einen Treffer gab, WO?

      1. Hi,

        probiers mal in der Art:
        $string = "123 345 456 346";
        while($string =~ /3/g){
          print pos $string;
        }

        Gruss vom Horst

      2. Lese die Datei Zeilenweise aus, trenne die Inhalte jeder Zeile an dem Trennzeichen welches Du für die Spalten in deiner Datei verwendet hast, und schon kannst Du alle Informationen die Du brauchst zusammenstellen.

        Ich glaube nicht das die Zeile
        $datei =~ s/hugo/igs;
        dir so viele Informationen ausspucken kann. Aber ich lasse mich gerne verbessern.

        greets
        myMojito

        --
        -------------------------------------------
        Mode ist eine Variable, Stil eine Konstante
      3. Hallo Tom,

        Du hast das Problem nicht verstanden.

        Vielleicht hättest du es besser beschreiben sollen...

        Ich habe eine komplette Datei in $datei.
        Jetzt suche ich nach z.B. dem Wort "Hugo":

        $datei =~ s/hugo/igs;

        Suchst du nur oder willst du ersetzen? m/  -->suchen!!
                                               s/  -->ersetzten!!

        Ich will wissen, falls es einen Treffer gab, WO?

        Du liest hier eine komplette Datei in einen String. Dabei geht aber deine gewünschte Zeileninformation verloren!!!
        Wie wärs wenn du stattdessen die datei in eine Liste einliest und dann nach deinem String suchst?
        @datei=<FILEHANDLE>;
        foreach $element(@datei)
          {
            $zeilenZähler++;
            if($element = m/hugo/igs)
              {
              print "hugo in Zeile $zeilenZähler gefunden";
              }
          }

        1. Wie wärs wenn du stattdessen die datei in eine Liste einliest und dann nach deinem String suchst?
          @datei=<FILEHANDLE>;
          foreach $element(@datei)
            {
              $zeilenZähler++;
              if($element = m/hugo/igs)
                {
                print "hugo in Zeile $zeilenZähler gefunden";
                }
            }

          Gut, aber was mache ich, wenn mein Treffer über zwei Zeilen geht?
          Du betrachtest doch, wenn ich es richtig verstehe, immer nur eine abgeschlossene Zeile durch das foreach, auch wenn das /..s was anderes vermitteln will.

          Tom

  2. Hi Tom,

    und jetzt alles zusammen:

    open (FILEHANDLE, "test.txt");
    @datei = <FILEHANDLE>;
    close FILEHANDLE;
    foreach $el(@datei){
      $z++;
      while($el =~ /hugo/g){
        print "Zeile:$z Stelle";
        print pos $el;
        print "\n";
      }
    }

    Gruss vom Horst