[gelöst] Stringmanipulation mit Perl - bin ich zu doof oder wer?

Begonnen von Pfriemler, 25 April 2015, 01:58:24

Vorheriges Thema - Nächstes Thema

Pfriemler

So, nach vier Stunden, fünf Foren, zwei Tutorials und 20 Versuchen werfe ich das Handtuch in die Runde. Vielleicht kann mir mal einer erklären, was hier schief läuft.

In nrdummy wird ein String als Zeitstempel, beispielsweise "25.04.2015 01:25" geschrieben.
Das folgende Notify soll einen neuen String generieren. Dazu muss ich die Zeitangabe extrahieren, sie besteht aus zwei Ziffern, einem Doppelpunkt und wieder zwei Ziffern. Das passende Regex dazu habe ich probiert u.a. bei Rubular, es funktioniert. Im Netz fand ich diverse Hinweise auf ähnliche Fragen. Alle lösen das etwa so:


define nfy_extracttime nrdummy {
   my $dbtimer = ReadingsVal("nrdummy", "state", "00:00");
   my ($newat) = $dbtimer =~ /\d\d:\d\d/;
   fhem ("set nrdummy2 $newat / $dbtimer");
}

Die letzte Zeile ist nur eine Testausgabe in den nrdummy2.
Das Ergebnis im Dummy lautet "1 / 25.04.2015 01:25". nrdummy wird also richtig gelesen. Aber die Stringmanipulation misslingt. 1 ist das binäres Ergebnis TRUE.
Wie bekomme ich aber einen Teilstring?
Ich habe auch mit Klammern operiert (edit: Bsp. $dbtimer =~ /(\d\d:\d\d)/ - also quasi der Bereich den ich eigentlich möchte).
$_ (liefert einen Weblink), $1 (bleibt leer), die Klammern rund um $newat variiert ...

Aus dem Web habe ich z.B.
my $str1 = 'AT1G7. +126[0]*';
  my $str2 = 'AT1G7. +126[0]*_|_chr1';
  ...
  (my $results) = $str2 =~ /\Q$str1/g;
  print $results if $results;

wo angeblich nur der Teil aus $str2 nach $results kopiert wird, der auch in $str1 vorkommt. Ohne Klammer.
Wo ist der Unterschied zu meiner Lösung.

Baue ich hingegen das ganze so (also ersetze zwei Ziffern, einen Punkt, wieder zwei Ziffern, einen Punkt, vier Ziffern und ein Leerzeichen (also ein Datum) durch nichts)

define nfy_extracttime nrdummy {
  my $dbtimer = ReadingsVal("nrdummy", "state", "00:00");
  $dbtimer =~ s/\d{2}\.\d{2}\.\d{4}\s//;
  $dbtimer .= ':00';
  fhem ("set nrdummy2 $dbtimer");
}

erscheint in nrdummy2 brav "01:25:00". Suchen und Ersetzen geht schon mal.

Gute Nacht!  ;D
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Hans Franz

Hallo,
teste mal
(my $newat) = $dbtimer =~ / \d\d:\d\d/g;
Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Pfriemler

Zitat von: Hans Franz am 25 April 2015, 02:42:41
Hallo,
teste mal
(my $newat) = $dbtimer =~ / \d\d:\d\d/g;
Gruß
Hans
Nicht zu glauben. Sowohl die Klammer um (my $newat) ist erforderlich, als auch die Option g. Jetzt geht's. *kopfkratz* Danke!
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."