Apfelbaum: String durchsuchen & ersetzen

Hallo Zusammen

Ich habe folgendes Problem:
Ich lese ein File Zeile für Zeile ein. Eine Zeile könnte z.B. so aussehen:
<td><h2>Produkt</h2><h3>$$PRODUKT_NAME$$ Rev. $PRODUKT_VERSION$$</h3>$$PRODUKT_COPYRIGHT$$</td>

Desweiteren habe ich ein Array: „arrayname{KEY} = Value“ wobei die keys die Strings zwischen den $$-Zeichen sind.
Nun möchte ich die Strings zwischen den $$-Zeichen mit den dazugehörigen Values aus dem Array ersetzen.

Hat das jemand verstanden?
Hat vielleicht sogar jemand ne passende Lösung?

Apfelbaum

  1. 你好 Apfelbaum,

    Ich lese ein File Zeile für Zeile ein. Eine Zeile könnte z.B. so aussehen:
    <td><h2>Produkt</h2><h3>$$PRODUKT_NAME$$ Rev. $PRODUKT_VERSION$$</h3>$$PRODUKT_COPYRIGHT$$</td>

    Desweiteren habe ich ein Array: „arrayname{KEY} = Value“ wobei die keys die Strings zwischen den $$-Zeichen sind.
    Nun möchte ich die Strings zwischen den $$-Zeichen mit den dazugehörigen Values aus dem Array ersetzen.

    $txt =~ s/$$([^$]+)$$/$hash{$1}/g;

    再见,
     克里斯蒂安

    --
    Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
    Microsoft: Where do you want to go today?
    Linux: Where do you want to go tomorrow?
    FreeBSD: Are you guys coming, or what?
    http://wwwtech.de/
    1. Toll, vielen Dank.

      Hab noch ne Frage:
      Was bedeutet "[^$]+" ?
      Ich habe es durch ".*?" ersetzt, zuvor kam ne Fehlermeldung

      1. Toll, vielen Dank.

        Hab noch ne Frage:
        Was bedeutet "[^$]+" ?

        Das ist ein Schreibfehler.

        $txt =~ s/$$([^$]+)$$/$hash{$1}/g;

        wäre richtig (maskiertes $)
        Also [^$]
        Eine zeichenklasse sdie alles ausser "$" zulässt
        Ich würde das Einschränken im Sinne von
        [A-Za-z0-9_-]+

        Es ist aber suboptimal:
        Was wenn der Hashkey nicht existiert?
        Wir verwenden besser s///eg mit einer sub

          
        $txt =~ s/\$\$([A-Za-z0-9_-]+)\$\$/template_to_hash_replace($1)}/eg;  
          
        sub template_to_hash_replace{  
          my $var = shift;  
          if( exists $hash{$var} ){  
            return $hash{$var};  
          }  
          else{  
            return "TEMPLATE_ERROR(".$var.")");  
          }  
        }  
        
        

        mfg Beat

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>       ><o(((°>
           <°)))o><                      ><o(((°>o
        1. $txt =~ s/$$([A-Za-z0-9_-]+)$$/template_to_hash_replace($1)}/eg;

          sub template_to_hash_replace{
            my $var = shift;
            if( exists $hash{$var} ){
              return $hash{$var};
            }
            else{
              return "TEMPLATE_ERROR(".$var.")");
            }
          }

            
          das ist echt super, vielen Dank. Falls ausser mir sonst noch wer den Code verwenden sollte und er nicht funktioniert, bei `s/\$\$([A-Za-z0-9_-]+)\$\$/template_to_hash_replace($1)}/eg;`{:.language-perl} ist die geschweifte Klammer am schluss zuviel.  
            
          Ein letztes Problem habe ich noch:  
          Wenn ein Value im Hash einen Backslah enthält wird der Value nur bis zu diesem Backslash ausgegeben. Hast du hierfür auch noch ne Lösung?
          
          1. Ups, mein Fehler, Backslash wird auch dargestellt.

          2. das ist echt super, vielen Dank. Falls ausser mir sonst noch wer den Code verwenden sollte und er nicht funktioniert, bei s/\$\$([A-Za-z0-9_-]+)\$\$/template_to_hash_replace($1)}/eg; ist die geschweifte Klammer am schluss zuviel.

            Ein letztes Problem habe ich noch:
            Wenn ein Value im Hash einen Backslah enthält wird der Value nur bis zu diesem Backslash ausgegeben. Hast du hierfür auch noch ne Lösung?

            du meinst du hast so etwas:

            my %hash = ( some_key = 'lm\nop',); # = 'lmnop'
            my %hash = ( some_key = "lm\nop",); # = 'lm
            op'

            wo es lauten müsste:

            my %hash = ( some_key = 'lm\nop',); # = 'lm\nop'

            ???

            mfg Beat

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

          Toll, vielen Dank.

          Hab noch ne Frage:
          Was bedeutet "[^$]+" ?

          Das ist ein Schreibfehler.

          Jupp, danke.

          Es ist aber suboptimal:
          Was wenn der Hashkey nicht existiert?

          Dann wird ein Leerwert eingesetzt, genau das, was ich will: eine Fehlermeldung in einem Template halte ich für suboptimal :)

          Was der OP will, kann er natürlich nur selber entscheiden.

          再见,
           克里斯蒂安

          --
          Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
          73.255437% der Statistiken spielen eine Genauigkeit vor, die durch die angewandte Methode nicht gerechtfertigt wird.
          http://wwwtech.de/
      2. Hallo Apfelbaum!

        Was bedeutet "[^$]+" ?

        http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen, Beispiele (2.-4.), (7.-9.) und (18.-19.).

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

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