altes Problem mit suche ersetze
blinddate
- perl
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ß
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
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
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
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
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
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
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
Re!
\s = genau ein Leerzeichen
Eigentlich ein Steuerzeichen (Leerzeichen, Tab, etc.).
Viele Grüße aus Frankfurt/Main,
Patrick
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
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
ich habe ein Template (Datei) die so aussieht.
Klingt nach einem Fall für Text::Template, siehe Archiv.
Siechfred