Wie Regex in Perlfunktion einbauen (Variable zurechtstutzen)?

Begonnen von fiedel, 10 Juli 2014, 19:46:33

Vorheriges Thema - Nächstes Thema

fiedel

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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Dietmar63

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.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

fiedel

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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

kpwg

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
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

fiedel

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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423

Elektrolurch

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
configDB und Windows befreite Zone!

fiedel

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
FeatureLevel: 6.1 auf Wyse N03D ; Deb. 11 ; Perl: v5.14.2 ; IO: HM-MOD-RPI-PCB + VCCU|CUL 868 V 1.66|LinkUSBi |TEK603
HM: SEC-SCO|SCI-3-FM|LC-SW4-PCB|ES-PMSW1-PL|RC-4-2|SEN-MDIR-O|SEC-WDS-2
CUL: HMS100TF|FS20 S4A-2 ; OWDevice: DS18S20|DS2401|DS2406|DS2423