Ich habe mich bei einem aktuellen "Version Bump" wieder mal im FHEM Code "verschmökert".
https://gl.petatech.eu/root/HomeBot/-/commit/bda734712206394e3ba71bb29d12c2fec13c5e72Und da bei WeekdayTimer diesen Diff gesehen
- push @newt, $triplett unless $triplett =~ m{$wp_name\b}xms;
+ push @newt, $triplett unless $triplett =~ m{\A$wp_name\b}xms;
wie üblich, ist mit mir der PBP Reflex durchgegangen (kein unless) und so habe ich mir mal die ganze Datei angeschaut.
Vorab: Ja, ich sehe an der Historie, dass da schon viel geschehen ist und auch viel "in die richtige Richtung".
Diese Anmerkungen sind also mehr ein "nice to have".
Klar ist, dass ein
unless $triplett =~ m{\A$wp_name\b}xms;ja eigentlich ein
if $triplett !~ m{\A$wp_name\b}xms;ist, aber der umliegende Code ist auch einen Kommentar wert:
my $actual_wp_reading = ReadingsVal( $name, "weekprofiles", undef );
my @newt = ();
my @t = split m{\s+}xms, $actual_wp_reading;
my $newtriplett = qq($wp_name:$wp_topic:$wp_profile);
push @newt, $newtriplett;
for my $triplett (@t) {
push @newt, $triplett unless $triplett =~ m{\A$wp_name\b}xms;
}
readingsSingleUpdate( $hash, "weekprofiles", join( " ", @newt ), 1 );
Ich sage jetzt nicht, dass man das als Einzeiler schreiben sollte, dadurch würde die Sache sicher nicht
übersichtlicher, aber diese Variablen-Eintagsfliegen sind auch nicht so der Bringer.
my @t = split m{\s+}xms, ReadingsVal( $name, 'weekprofiles');
my @newt = ( qq($wp_name:$wp_topic:$wp_profile) );
push @newt, grep { $_ !~ m{\A$wp_name\b}xms } @t;
readingsSingleUpdate( $hash, 'weekprofiles', join(' ', @newt), 1 );
Meinetwegen so. Wenigstens muss man sich nicht Variablennamen aus der Nase ziehen,
die eh nur einmal benutzt werden. t, newt, newtriplett, triplettino_nuovo, ...
Auch in solchen Fällen
my @wdtNames;
if ( $group eq "all" ) {
@wdtNames = devspec2array('TYPE=WeekdayTimer');
}
else {
@wdtNames = devspec2array("TYPE=WeekdayTimer:FILTER=WDT_Group=$group");
}
ist - zumindest meiner Ansicht nach - weniger mehr. MIt weniger meine ich "weniger Redundanz":
my @wdtNames = $group eq 'all' ? devspec2array('TYPE=WeekdayTimer')
: devspec2array("TYPE=WeekdayTimer:FILTER=WDT_Group=$group");
Damian Conway spricht (in diesen neuen PBP Videos auf der O'Reilly Webseite) davon, wie wir im Kopf eine GPU und eine CPU haben.
Die GPU ist schon hunderte von Mio Jahren in Entwicklung und ist unser visuelles System. Die CPU ist evolutionär relativ jung und
zwar sehr flexibel, aber auch sehr langsam. Wenn er das so sagt, hört sich das komisch an, aber ich kann aus eigener Erfahrung
bestätigen, dass man bestimmten Code "sofort visuell intuitiv" erfassen kann, während man sich durch anderen "bewusst kognitiv"
durchquälen muss.
Die FHEM Codebasis fällt überwiegend in die zweite Kategorie. ;-)
Bevor jetzt wieder die Labersäcke hervorgekrochen kommen: Ich sage nicht, dass man FHEM Code "ohne nachzudenken" bearbeiten
können sollte, aber es wäre IMHO vorteilhaft, wenn man relativ viel der kognitiven Last eben ans Sehzentrum auslagern könnte.
my $hash = $defs{$name};
if ( defined $hash ) {
WeekdayTimer_DeleteTimer($hash);
return WeekdayTimer_SetTimer($hash);
}
return qq(No Device named $name found!);
->
my $hash = $defs{$name} // return qq(No Device named $name found!);
WeekdayTimer_DeleteTimer($hash);
return WeekdayTimer_SetTimer($hash);
Jo ... das nur am Rande.
map { delete $days{$_} } ( 7, 8 );
There is more than one way to do it, ... siehe
https://perldoc.perl.org/functions/delete.htmlHash slice anyone?
delete @days{7,8};
$fensterKontakte =~ s/^\s+//x;
$fensterKontakte =~ s/\s+$//x;
und dabei haben "wir" so schöne Funktionen in 99_Utils.pm - wie z.B. "trim".
my @tage = @{ WeekdayTimer_daylistAsArray( $hash, $daylist ) };
if ( @tage > 0 ) {
$daylist = join( "", @tage );
}
else {
unshift( @$a, $daylist );
$daylist = "";
}
$hash->{GlobalDaylistSpec} = $daylist;
return;
->
my @tage = @{ WeekdayTimer_daylistAsArray( $hash, $daylist ) };
unshift @$a, $daylist if (!@tage);
$hash->{GlobalDaylistSpec} = join '', @tage;
return;
Merke:
'' = join '', ()
if ( ( @t > 1 && @t < 5 ) && $t[0] gt "" && $t[1] gt "" ) {
"Greater than" Vergleich mit einem leeren String ist komisch... vermutlich meinte man "ne"?
gt, lt und cmp sind eher für lexikalische Vergleiche (vulgo: Sortierung)