Hallo,
ich komme bei einem Problem nicht weiter: in einem Dummy steht bei mir ein Wert *123# (anstelle 123 jede x-beliebige Zahl). Ich möchte nun in diesem dummy nur noch die Zahl stehen haben.
Laut regexr.com (http://regexr.com) lautet die regexp ([0-9])\w+
Ich habe nun folgende Routine geschrieben:
sub Zahlextrahieren($)
{
my ($wo) = @_;
if ( $wo =~ /[0-9]\w+/ ) {fhem("set $wo $1")}
else {fhem("set $wo humbug")}
}
Aufgerufen wird die Funktion aus FHEM mit
Zahlextrahieren("mydummy")
Bei erfolgreichem Match sollte der erste Treffer in $1 stehen - das habe ich der perl-Doku entnommen. Dort stand auch, dass man das if nutzen sollte, sonst könnte $1 noch von einer früheren Auswertung einen Wert haben, der bei einem "Missmatch" unverändert bestehen bleibt. Auch ohne das if funktioniert es nicht, die Auswertung ergibt immer keinen Treffer.
Kann mir jemand bitte etwas Nachhilfe geben?
Danke
Jürgen
Du übergibst den Namen mydummy? Aber im String mydummy ist doch gar keine Zahl. Du musst schon den state Wert von mydummy übergeben.
Zitat von: ujaudio am 24 Januar 2019, 18:03:11
...in einem Dummy steht bei mir ein Wert *123# (anstelle 123 jede x-beliebige Zahl)...
Kann mir jemand bitte etwas Nachhilfe geben?
Wo kommt den *123# her. Wenn Du es mit ReadingsVal holst dann könnte ReadingsNum die Lösung sein.
Grüße Jörg
Der Wert in dem Dummy ist gegeben: er beginnt mit dem Sternchen, es folgen Ziffern und es endet mit dem Lattenzaun - das ergibt sich aus meiner Anwendung.
Die Funktion in 99_myUtils.pm ist nun wie folgt:
sub Zahlextrahieren($)
{
my ($var) = @_;
my $wert = Value($var);
if ( $wert =~ /[0-9]\w+/ ) {fhem("set $var $1")}
else {fhem("set $var humbug")}
}
und wird aus einem notify (Macro) aufgerufen:
al_auswertung {
Zahlextrahieren ("al_eingabe");
#da kommt noch mehr Code...
}
Leider funktioniert das auch nicht: es findet wohl ein Match statt, den der Klammerausdruck nach dem if ist wahr und so wird nun der Originalwert (also *123#) wieder zurückgegeben. Wenn ich es nicht hinbekomme - ich werde mich morgen nochmals mit meinem Perlbuch beschäftigen - dann muss ich es halt über substring machen. Was mich nur wundert ist, dass es mit dem o.g. Tool funktioniert.
Einen schönen Abend
Jürgen
Bisschen viel Aufwand wie ich finde
{fhem("set $var " . ReadingsNum($var,'state',-1))}
Den Rest kannste alles löschen. Kannst das ganze auch gleich im Notify machen.
Toll, an was die FHEM-Entwicler schon alles gedacht haben! readingsNum ist eine einfache Lösung. Jetzt kann ich mal weiter programmieren - aber mit den regexp werde ich mich dennoch nochmals auseinandersetzen.
Einen lieben Gruß
Jürgen
Zitat von: ujaudio am 25 Januar 2019, 08:20:30
Toll, an was die FHEM-Entwicler schon alles gedacht haben!
nützt nur nix, solange die Anwender nicht auf die Idee kommen, Doku zu lesen, sondern stattdessen lieber versuchen, das Rad zum 3459. Mal neu zu erfinden...
if ( $wo =~ /\*([0-9]\w+)\#/ ) {Debug $1}