FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Waldmensch am 15 Juli 2019, 20:32:57

Titel: [gelöst] Perl Frage zu Userreading
Beitrag von: Waldmensch am 15 Juli 2019, 20:32:57
Ich habe ein Userreading, was mir über die Stati des Mähroboters die Gartenbewässerung beeinflussen soll. Folgender Code:

Collision_Risk:status:.* {
my @array = ( 4,5,6,30,32,33 );
my $match = ReadingsVal("$name","status",0);
(grep /$match/,@array) ? 1 : 0;;}


Das funktioniert soweit, bis auf die Tatsache, das bei $match = 0 das grep scheinbar einen Treffer landet und das Userreading eine unerwünschte 1 zurückgibt. Kann ein Perl Fuchs mal drüberschauen und einen Tipp geben, wie das zu umschiffen ist? Der Plan ist, wenn $match exakt im @array enthalten ist, soll das Userreading 1 sein. In allen anderen Fällen 0. Ich wollte mir eine Schleife oder switch/case ersparen.
Titel: Antw:Perl Frage zu Userreading
Beitrag von: Otto123 am 15 Juli 2019, 21:04:35
ich bin kein Perl Fuchs aber ein Blick ins Buch  (https://perldoc.perl.org/5.30.0/functions/grep.html)bzw. hier http://www.hidemail.de/blog/grep-perl.shtml
sagt mir, der grep Ausdruck sollte so sein:
grep {$_==$match}@array

Der gibt aber auch schon 1 und 0 zurück, also den ? Teil Kannst Du Dir aus meiner Sicht sparen.
Also so, ungetestet:
Collision_Risk:status:.* {
my @array = ( 4,5,6,30,32,33 );
my $match = ReadingsVal("$name","status",0);
grep {$_==$match}@array}


Gruß Otto
Titel: Antw:Perl Frage zu Userreading
Beitrag von: DeeSPe am 16 Juli 2019, 08:28:20
Einfach im Regex Anfang und Ende beschränken:
(grep /^$match$/,@array) ? 1 : 0;;

Gruß
Dan
Titel: Antw:Perl Frage zu Userreading
Beitrag von: Waldmensch am 16 Juli 2019, 11:25:48
Zitat von: DeeSPe am 16 Juli 2019, 08:28:20
Einfach im Regex Anfang und Ende beschränken:
(grep /^$match$/,@array) ? 1 : 0;;

Gruß
Dan

BINGO! Genau so funzt es :)

Collision_Risk:status:.* {
my @array = ( 4,5,6,30,32,33 );
my $match = ReadingsVal("$name","status",0);
(grep /^$match$/,@array) ? 1 : 0;;}