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.
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
Einfach im Regex Anfang und Ende beschränken:
(grep /^$match$/,@array) ? 1 : 0;;
Gruß
Dan
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;;}