String durchsuchen & ersetzen
Apfelbaum
- perl
0 Christian Kruse0 Apfelbaum0 Beat0 Patrick Andrieu
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
你好 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;
再见,
克里斯蒂安
Toll, vielen Dank.
Hab noch ne Frage:
Was bedeutet "[^$]+" ?
Ich habe es durch ".*?" ersetzt, zuvor kam ne Fehlermeldung
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
$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?
Ups, mein Fehler, Backslash wird auch dargestellt.
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
你好 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.
再见,
克里斯蒂安
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