[ gelöst ]Perl Hilfe nötig

Begonnen von Michael, 01 Mai 2015, 10:14:40

Vorheriges Thema - Nächstes Thema

Michael

Moin

Brauch mal wieder eure Hilfe.  :-[

Habe einen BMP085 (180) mit dem ich den Luftdruck messe.

Nur habe ich mir in der 99_myUtils.pm eine Trendanzeige eingebaut.
Der steigende und fallende Luftdruck wird richtig Angezeigt nur der gleichbleibende "+0.0" nicht.

Was mache ich hier : return $hPaText3h = "-".$leer.$hPaTrendWert   if ($hPaTrendWert =  /\+0(.)0/g ); mal wieder Falsch.

Hier  "/\+0(.)0/g" wird der Fehler liegen, nun habe ich schon einiges Versucht.
Und muss Zugestehen das ich es nicht Verstehe.  :o

Hier mal der gesamte Codeteil.
#statPressureTendency3h
sub hPaTrend()
{
my $leer        = " ";
my $hPaTrendWert        = substr((ReadingsVal( "Luftdruck", "statPressureTendency","")),22,4);
my $hPaText3h;
                             
return $hPaText3h = "↓".$leer.$hPaTrendWert   if ($hPaTrendWert =~ /\-/i  );
return $hPaText3h = "↑".$leer.$hPaTrendWert   if ($hPaTrendWert =~ /\+/i  );
return $hPaText3h = "-".$leer.$hPaTrendWert   if ($hPaTrendWert =  /\+0(.)0/g );
}

Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

rudolfkoenig

In der letzten Zeile fehlt ein ~, = prueft auf numerische Gleichheit.
Wird aber nie erreicht, da die vorletzte Zeile auch bei "+0.0" zuschlaegt.
Das Modifier i (ignore case) ist im Zusammenhang mit + oder - sinnlos.
Tipp: "perldoc perlretut" durchlesen.

Waere nicht besser statt regexp ganz altmodisch auf "> 0", "< 0", "== 0" zu pruefen? Geht nur, falls $hPaTrendWert ein Zahl ist.

Icinger

Beim letzten Ausdruck brauchst du ja eigentlich kein >if< mehr.

Wenn die ersten beiden nicht stimmen, muss ja eigentlich automatisch der letzte passen, also genügt ein
return $hPaText3h = "-".$leer.$hPaTrendWert;

lg, Ici

PS: RegExes teste ich sehr gerne mit www.regexr.com
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Michael

Vielen Dank euch beiden.

@rudolfkoenig
ZitatTipp: "perldoc perlretut" durchlesen.
Werde ich tun.

ZitatWaere nicht besser statt regexp ganz altmodisch auf "> 0", "< 0", "== 0" zu pruefen? Geht nur, falls $hPaTrendWert ein Zahl ist.
Leider sind da minus und plus Werte möglich.

@Icinger
ZitatPS: RegExes teste ich sehr gerne mit www.regexr.com
Werde mich mal auf der Suche nach einer Deutschen HP machen.
Hier ist mein größtes Problem.  :-[

ZitatWenn die ersten beiden nicht stimmen, muss ja eigentlich automatisch der letzte passen, also genügt ein return $hPaText3h = "-".$leer.$hPaTrendWert;
Das ist schon so wie rudolfkoenig schrieb.
ZitatWird aber nie erreicht, da die vorletzte Zeile auch bei "+0.0" zuschlaegt.

Komme ich zu einer Lösung werde ich sie hier reinstellen.
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP

Icinger

Dreh den Spieß doch einfach um. Teste zuerst auf "+0.0".

Wenn das zutrifft, steigt die Sub eh aus.

Also:
#statPressureTendency3h
sub hPaTrend()
{
my $leer        = " ";
my $hPaTrendWert        = substr((ReadingsVal( "Luftdruck", "statPressureTendency","")),22,4);
my $hPaText3h;
                             
return $hPaText3h = "↓".$leer.$hPaTrendWert   if ($hPaTrendWert =~ /\-/i  );
return $hPaText3h = "-".$leer.$hPaTrendWert   if ($hPaTrendWert =~  /\+0(.)0/g );
return $hPaText3h = "↑".$leer.$hPaTrendWert; #Das hier muss nicht sein:   if ($hPaTrendWert =~ /\+/i  );
}


Aber wie Rudi schon gesagt hat, das könntest du auch einfacher machen ohne Regexen:


sub hPaTrend()
{
my $leer        = " ";
my $hPaTrendWert        = substr((ReadingsVal( "Luftdruck", "statPressureTendency","")),22,4);
my $hPaText3h;
                             
return $hPaText3h = "↓".$leer.$hPaTrendWert   if ($hPaTrendWert <0);
return $hPaText3h = "↑".$leer.$hPaTrendWert   if ($hPaTrendWert >0);
return $hPaText3h = "-".$leer.$hPaTrendWert;
}


lg, Ici

PS: Deine Regex passt eh richtig auf das "+0.0"
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Michael

@Icinger

Super, so klappt es!
Zitat#statPressureTendency3h
sub hPaTrend()
{
my $leer        = " ";
my $hPaTrendWert        = substr((ReadingsVal( "Luftdruck", "statPressureTendency","")),22,4);
my $hPaText3h;

return $hPaText3h = "↓".$leer.$hPaTrendWert                   if ($hPaTrendWert =~ /\-/i  );
return $hPaText3h = "=".$leer.substr($hPaTrendWert,1,3)   if ($hPaTrendWert =~  /\+0(.)0/g );
return $hPaText3h = "↑".$leer.$hPaTrendWert;
}

Aber mit eure Tipps www.regexr.com und perldoc perlretut werde ich mich noch Beschäftigen.
Gruß, Michael

FHEM 6.0 auf RPi 3
CUL V3 868 Mhz | JeeLink LaCrosse & PCA301 | CCU3
BMP085(180) | 14x TX29DTH-IT | 5x PCA 301 | SMA Peripheries | MobileAlerts MA-10(100,120PRO,200,251,410,650,660,800) | HM IP