blinddate: altes Problem mit suche ersetze

Hallo,

ich habe ein Template (Datei) die so aussieht.

Messwert: "H1_temperatur" °C
usw.

Jetzt lese ich die Datei mit jeder Zeile ein und sage.
Suche alles zwischen den Anführungszeichen

$variablenname = s/^"+"$

und es sollte H1_temperatur herauskommen. Macht natürlich nicht !!!

zum Schluss habe ich den Messwert von x geholt und will Ihn eintragen

$zeile =~ s/^"+"$/$data/;

Ich will nun das das Ergebnis "Messwert: 23,7 °C" aussieht.

Eigentlich macht Perl Spaß nur nicht mit suchen und ersetzen. :-)

Gruß

  1. Hi,

    $variablenname = s/^"+"$

    mal abgesehen von den grammatischen Fehlern: Du suchst nach etwas, das am Stringanfang steht, aus beliebig vielen (mindestens einem) Doublequotes besteht, danach ein Doublequote besitzt und schon am Ende des Strings ist. Sprich: Du suchst nach einem String, der komplett aus Doublequotes besteht und derer mindestens zwei hat.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      und danke für die schnelle Antwort. Leider verstehe ich überhaupt nicht was Beat mir zu erklären versucht.

      Das ist meine Zeile

      Messwert: "H1_temperatur" °C

      und ich will nun alles was zwischen 2 Anführungszeichen steht in eine Variable speichern.
      In meiner Variable sollte H1_temperatur stehen (ohne Anführungszeichen)

      Danach kommt mein $zeile =~ s/"[^"]+"/$data/; und ich speichere anstelle des Namens in den Anführungszeichen nun meine Temperatur.
      z.B.

      Messwert: 23.2 °C (ohne Anführungszeichen)

      Ich suche immer noch die Möglichkeit aus einer Zeile alles was zwischen " " in eine Variable abspeichern kann.

      Gruß
             blinddate

      1. Hallo blinddate!

        Aus:

        Messwert: "H1_temperatur" °C

        soll:

        Messwert: 23.2 °C (ohne Anführungszeichen)

        werden? Wobei klargestellt ist, dass in der Zeile, die es zu ersetzen gibt, keine Zahlen vor dem »°C« vorkommen, und dieses immer am Zeilenende steht?

        my $line =~ s/"\w*"(.*)$/$temperature$1/;

        my $temperature = 23.2;  
          
        for (<DATA>) {  
          $_ =~ s/"\w*"(.*)$/$temperature$1/;  
          print $_;  
        }  
          
        __DATA__  
        Messwert: "H1_temperatur" °C  
        Messwert: "H2_temperatur" °C  
        Messwert: "H3_temperatur" °C
        

        Ausgabe:
        Messwert: 23.2 °C
        Messwert: 23.2 °C
        Messwert: 23.2 °C

        Oder soll noch etwas anderes 'rauskommen? Obiges geht natürlich nur, wenn zwischen den Doublequotes nur Wortzeichen (\w steht für alles, was a bis z, A bis Z, Zahlen und Underscore ist).

        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,

          ich suche den Befehl zum herausholen (suchen) des Wortes (string) zwischen den Anführungszeichen, ohne ersetzen !!!

          Zeile:
          Messwert: "H1_temperatur" °C

          !!!! nicht ersetzen !!!! nur den String zwischen den Anführungszeichen herausholen, so wie in meiner Anfrage beschrieben.

          Das ist meine Zeile

          »»Messwert: "H1_temperatur" °C
          »»und ich will nun alles was zwischen 2 Anführungszeichen steht
          »»in eine Variable speichern.
          »»In meiner Variable sollte H1_temperatur stehen (ohne Anführungszeichen)

          Gruß und Dank
                  blinddate

          1. ich suche den Befehl zum herausholen (suchen) des Wortes (string) zwischen den Anführungszeichen, ohne ersetzen !!!

            Zeile:
            Messwert: "H1_temperatur" °C

            Bitte klär mich auf.
            ist "H1_temperatur" ein variables Wort?

            Wenn ja, geh hin und haue dich selbst dafür, dass du weder die Variable angemessen beschreibst, noch Beispiele gibst, wie sie auch lauten könnte.

            Wenn nein, haue dich dafür, weil du etwas extrahieren willst, das du eh schon kennst.

            Troll Your Self....

            mfg Beat

            --
            Woran ich arbeite:
            X-Torah
            ><o(((°>       ><o(((°>
               <°)))o><                      ><o(((°>o
            1. Morgen,

              schuldig in allen Anklagepunkten !!!!!!!!!!
              Ich brauche den Namen "H1_temperatur" damit ich den Messwert aus einem Hash holen kann um danach per "Ersetzung" den Messwert anstelle des "H1_temperatur" zu setzen.
              Ja.. ich habe mehrere Werte aber das mit der Schleife ist klar.

              Nochmals sorry..... Gedanken waren weiter als die Finger geschrieben haben.

              Der Code hier funktioniert gut, nur habe ich noch Probleme (übertrieben)
              wenn zwischen : und " kein Leerzeichen liegt.

              z.B.
              my $line = 'Messwert:"H1_temperatur" °C';
              my $match = $1 if $line =~ m/\s"(\w*)"\s.*$/;

              dann funktioniert es nicht. Man könnte nun sagen ... schreibe dein Template mit Leerzeichen, mir wäre es aber für die Zukunft lieber wenn der Code in beiden Fällen funktioniert. (Vergessen ist vergessen)

              Danke
                   blinddate

              1. Hallo blinddate!

                Der Code hier funktioniert gut, nur habe ich noch Probleme (übertrieben)
                wenn zwischen : und " kein Leerzeichen liegt.

                z.B.
                my $line = 'Messwert:"H1_temperatur" °C';
                my $match = $1 if $line =~ m/\s"(\w*)"\s.*$/;

                Dann brauchst Du einen Quantifier (*,+ oder ?):

                \s  = genau ein Leerzeichen
                \s? = 0 oder genau ein Leerzeichen
                \s+ = ein oder beliebig viele Leerzeichen
                \s* = 0 oder beliebig viele Leerzeichen

                Steht alles hier!

                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. Re!

                  \s  = genau ein Leerzeichen

                  Eigentlich ein Steuerzeichen (Leerzeichen, Tab, etc.).

                  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 linddate!

            ich suche den Befehl zum herausholen (suchen) des Wortes (string) zwischen den Anführungszeichen, ohne ersetzen !!!

            Dann muss Du Dich klarer ausdrücken:
            Dein Beitragstitel:
              »Problem mit suchen _ersetzen_"
            Aus dem Ausgangsposting:
              »__$zeile =~ s/^"+"$/$data/__;
               Ich will nun das das Ergebnis "Messwert: 23,7 °C" aussieht.«

            Auch in Deiner Antwort an Cheatah postest Du ein Ersetzungsmuster. Also was nun?

            Gibt es nur eine Zeile, die so aussieht? Gibt es mehrere wie in meinem Beispiel unter __DATA__?

            my $line = 'Messwert: "H1_temperatur" °C';  
            my $match = $1 if $line =~ m/\s"(\w*)"\s.*$/;
            

            H1_temperatur (ohne "") ist nun in $match.

            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. ich habe ein Template (Datei) die so aussieht.
    Messwert: "H1_temperatur" °C
    usw.
    Jetzt lese ich die Datei mit jeder Zeile ein und sage.
    Suche alles zwischen den Anführungszeichen
    $variablenname = s/^"+"$
    und es sollte H1_temperatur herauskommen. Macht natürlich nicht !!!
    zum Schluss habe ich den Messwert von x geholt und will Ihn eintragen
    $zeile =~ s/^"+"$/$data/;
    Ich will nun das das Ergebnis "Messwert: 23,7 °C" aussieht.

    zerlege deine RE in verschiedene Tokens mit der qr// Syntax.

    Nehmen wir an, du hast "a b c"
    und willst, dass am Ende "a data c"
    dasteht,
    wobei a, b, c beschreibbar sind mit Patters

    my $a = qr/(?:Messwert|Sollwert):/;  
    my $b = qr/"[^"]*"/;  
    my $c = qr/°[CKF]/; #Celsius, Kelvin oder Farenheit  
    
    

    Dann bauen wir das Suchpattern zusammen:

    my $pat = qr/^($a) $b ($c)/; # hier werden $1 und $2 gespeichert.

    Und nun der Test: Angenommen wir haben ein Filehandel offen:

    while(<FH>){  
       s/$pat/$1 $data $2/;  
    }
    

    Wir haben das Pattern ausserhalb der Schleife zusammen gebaut. Das ist also schon mal schnell.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o
  3. ich habe ein Template (Datei) die so aussieht.

    Klingt nach einem Fall für Text::Template, siehe Archiv.

    Siechfred

    --
    Obacht, hinter jedem noch so kleinen Busch könnte ein Indianer sitzen!