FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: fiedel am 10 Juli 2014, 19:46:33

Titel: Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: fiedel am 10 Juli 2014, 19:46:33
Hallo Zusammen,

bin gerade sowas von hart an meine Grenzen gestoßen... Da frag ich doch mal - nicht die Maus, sondern die Perlkönner.  ;)

In einer Perlfunktion in der MyUtils habe ich eine Variable, die z.B. den Wert " 5.0 m³ " enthält. Ich möchte damit rechnen und dazu muss das " m³ " verschwinden. Das Regex sollte " \d.\d " sein, soviel hab ich schon herausbekommen.

Wie vermixe ich das aber nun mit der Variable, so dass nur der Wert ohne Maßeinheit übrig bleibt? Es geht um die Ausgabe von " ReadingsVal("zi_level","state",0) " Hier mal die Funktion im Original:


#Zisterne Levelanzeige
######################
sub zi_balken()
{
my $p=int(ReadingsVal("zi_level","state",0)*10);
return '<div align="bottom" style="width:20px;height:'.(81.6-$p).'px;margin-left:30px;background-color:grey"></div><div align="bottom" style="width:20px;height:'.$p.'px;margin-left:30px;background-color:blue"></div>'
}


Ich könnte natürlich auch die Anzeige der Maßeinheit abschalten. So hatte ich es bis jetzt. Aber die Details sind ja wichtig und lernen möchte ich auch was neues...  :)

Gruß

Frank
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: Dietmar63 am 11 Juli 2014, 07:15:10
ich habe es mal so gemacht:


       $reg    = '(\d+\.\d+) perl.*';

       if ($res=~/$reg/g ){
         my $numerischerWert = $1;
       }



sucht nach einer Zahl des Formats 9999.9999, beliebig viele Ziffern vor und nach dem Komma. Danach muss perl als text folgen.
Die Klammern sorgen dafür dass subTreffer in den Variablen $1 .. $10 ... abgelegt werden. Also in diesem Fall die nackte Zahl.

Der \ vor dem Punkt ist notwendig, damit die Sonderzeichenfunktion maskiert wird.
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: Dietmar63 am 16 Juli 2014, 18:36:42
hat die Anregung dir geholfen?
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: fiedel am 17 Juli 2014, 07:17:55
Hi Dietmar,

vielen Dank für das Beispiel! Leider liefert mein Zisternensensor im Moment keine nutzbaren Werte. Hab letztens wegen dieser Berechnung so viel rumprobiert, dass nun mein reading "content" fehlt. Aktuell buddle ich aber im Garten für die Bewässerungsanlage, sodass ich an der Sensorgeschichte nicht weitermkomme. Ein Stress mit der Technik...  ;)

Wenn ich wieder im "Innendienst" bin, bringe ich das in Ordnung und teste auch dein Beispiel.

Nochmals vielen Dank und viele Grüße

Frank
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: kpwg am 17 Juli 2014, 22:13:59
Hallo Frank,

ich bin zwar alles andere als ein Perlkönner, aber ich würde die Betrachtungsweise ändern: immer mit Zahlen rechnen und erst bei der Anzeige einen String daraus machen. Meine Dauerbaustelle ist ECMD bzw. Ethersex, da ich auch gerne zum Lötkolben greife. Da funktioniert das bestens.

Ein aktuelles Beispiel: http://forum.fhem.de/index.php/topic,25416.0.html (http://forum.fhem.de/index.php/topic,25416.0.html)
Ich mache STATE erst ganz am Ende mit stateFormat "rund". Dabei ist mir state weniger wichtig; hauptsache sinnvoll belegt. Bei mehreren identischen readings verschiedener Devices mit readingsgroup.

Viele Grüße, Ricardo
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: fiedel am 18 Juli 2014, 07:22:36
Hi Ricardo,

da muss ich dir voll zustimmen. Sonst mache ich das auch so. Werde auch noch diese Variante versuchen. Ggf. auch per Readingsgroup. In diesem Fall war die Herangehensweise anders, da ich versuche aus dem an sich autarken Wert "Füllstand Zisterne" die Niederschlagsmenge zu berechnen. Das klappt übrigens nur, wenn die Zisterne noch nicht ganz voll ist.  ;)

Gruß

Frank
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: Elektrolurch am 18 Juli 2014, 08:43:21
Hallo,

da gibt es mehrere Möglichkeiten:

1.
$d enthält den Wert mit Maßeinheit:
($d,$e) = split(' ',$d);
dann hast Du in $d den Wert, in $e die Maßeinheit, wenn beides durch ein Leerzeichen getrennt sind.
2.
$d=~s/m3//;

Ersetzt in $d den Teilstring m$ durch nichts.
Wäre dann sinnvoll,  wenn zwischen Wert und Einheit kein Leerzeichen steht.

Dass müsste Dir so weiterhelfen und Deine perl-Kenntnisse erweitern :-)

Gruß

Elektrolurch
Titel: Antw:Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?
Beitrag von: fiedel am 18 Juli 2014, 09:08:35
Hi Elektrolurch,

vielen Dank! Werde das probieren. Auch deine Erklärung dazu ist so, dass ich sie verstehe. Durch die vorbelegten Variablen von Perl in Verbindung mit Regex gibt es meist einen irren Kauderwelsch an Sonderzeichen den man erst mal interpretieren können muss.  :)

Gruß

Frank