FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Michael am 01 Mai 2015, 10:14:40

Titel: [ gelöst ]Perl Hilfe nötig
Beitrag von: Michael am 01 Mai 2015, 10:14:40
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 );
}

Titel: Antw:Perl Hilfe nötig
Beitrag von: rudolfkoenig am 01 Mai 2015, 10:43:24
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.
Titel: Antw:Perl Hilfe nötig
Beitrag von: Icinger am 01 Mai 2015, 10:44:40
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 (http://www.regexr.com)
Titel: Antw:Perl Hilfe nötig
Beitrag von: Michael am 01 Mai 2015, 11:26:35
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.
Titel: Antw:Perl Hilfe nötig
Beitrag von: Icinger am 01 Mai 2015, 12:04:12
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"
Titel: [ gelöst ] Perl Hilfe nötig
Beitrag von: Michael am 01 Mai 2015, 12:26:07
@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.