FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: betateilchen am 04 April 2024, 23:50:54

Titel: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 04 April 2024, 23:50:54
Zitat von: rudolfkoenig am 04 April 2024, 23:37:17Off-Topic: mein perl 5.38 beschwert sich: Smartmatch is deprecated at FHEM/TimeSeries.pm line 113.

Auch offtopic: bei switch ist es ähnlich. Diese Experimente sollen wohl ab 5.42 komplett entfernt werden.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 05 April 2024, 09:24:15
Ich habe den Beitrag von Udo abgeteilt und hierher gestellt, damit wir uns mit dem Schicksal von Smartmatch, given, when, switch und was weiß ich noch für experimentellen Features von Perl befassen und für den FHEM-Code darauf reagieren.

Interessant (habe mich aber nicht weiter damit auseinandergesetzt): Perl 5.20 and the fate of smart matching and given-when (https://stackoverflow.com/questions/16927024/perl-5-20-and-the-fate-of-smart-matching-and-given-when).

Ich liebe ~~ für die Prüfung, ob ein Element in einem Array steht.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: CoolTux am 05 April 2024, 13:30:07
Na toll. Da darf ich ja dann einiges umschreiben.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 05 April 2024, 13:37:13
Zitat von: CoolTux am 05 April 2024, 13:30:07Na toll. Da darf ich ja dann einiges umschreiben.
So neu ist das ja eigentlich sich nicht... In der Perl-Ecke gibt es dazu einige "Warnungen" - die sind mehrere Jahre alt...

Smartmatch z.B. müßte relativ einfach mit einem grep zu fixen sein. (Muss ggf. mal suchen.)
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 05 April 2024, 13:53:01
Zitat von: CoolTux am 05 April 2024, 13:30:07Na toll. Da darf ich ja dann einiges umschreiben.

Zitat von: Beta-User am 05 April 2024, 13:37:13So neu ist das ja eigentlich sich nicht...

Stimmt, die smartmatch Problematik ist seit 5.18 bekannt und deshalb sind die darauf basierenden features (z.B. switch/given) seither als "experimental" gekennzeichnet. Dass die irgendwann wegfallen, ist nicht überraschend, inzwischen weiß man halt auch, wann das passieren wird.

Meine drei aktiven Module, die davon betroffen sind, habe ich heute umgebaut. Dabei habe ich given/when einfach durch if/elsif/else ersetzt. Das war die einfachste Lösung, die versionsunabhängig und ohne weitere Modul-Abhängigkeiten funktioniert.

Zitat von: Dr. Boris Neubert am 05 April 2024, 09:24:15Ich liebe ~~ für die Prüfung, ob ein Element in einem Array steht.

Zitat von: Beta-User am 05 April 2024, 13:37:13Smartmatch z.B. müßte relativ einfach mit einem grep zu fixen sein.

if (grep(regex, @array)) {}
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 05 April 2024, 13:58:22
Zitat von: betateilchen am 05 April 2024, 13:53:01if grep(regex, @array) {}

Meine mich erinnern zu können, dass das perlcritics in dieser Fassung nicht optimal findet und die block-Variante vorschlägt. Mobil, ungetestet so:
if (grep m{regex} @array) {}
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 05 April 2024, 14:11:43
ja, ich hatte auf die Schnelle beim Tippen die Klammern vergessen.

Ansonsten bleibe ich aber bei dieser Variante:

if (grep(regex, @array)) {}
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 05 April 2024, 14:18:37
Hatte nicht behauptet, dass es in der Komma-separierten Variante nicht funktioniert.

Wollte nur anregen, bei einer Überarbeitung der Module ggf. schlicht das online-tool oä. zu nutzen und bei der Gelegenheit gleich die (afair) "bessere" Variante zu wählen. That's all...
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 05 April 2024, 15:23:38
Hier noch ein (funktionierendes und hoffentlich verständliches) Beispiel, wie das z.B. in "98_monitoring.pm" nach der perlcritic-Optimierung aussieht (unter Ignorierung der "postfix-if"-critic...):
return if @blacklist && grep { m{\A${name}\z}x } @blacklist;
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 05 April 2024, 15:47:41
Zitat von: Beta-User am 05 April 2024, 15:23:38Hier noch ein ... Beispiel, wie das z.B. in "98_monitoring.pm" nach der perlcritic-Optimierung aussieht (unter Ignorierung der "postfix-if"-critic...)

Entschuldigung, aber das ist doch Käse.

Entweder, Du willst es (im Sinne von perlcritic) richtig machen, dann mach es aber auch komplett richtig.
Aber doch bitte nicht den einen (perlcritic)-Mangel beseitigen und den anderen bewusst ignorieren.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 06 April 2024, 08:32:27
Zitat von: betateilchen am 05 April 2024, 15:47:41Entweder, Du willst es (im Sinne von perlcritic) richtig machen, dann mach es aber auch komplett richtig.
Aber doch bitte nicht den einen (perlcritic)-Mangel beseitigen und den anderen bewusst ignorieren.
Schön, dass du das highlightest :) .
Auch Perlcritic kennt mehrere Stufen, und macht Unterschiede. Das "grep"-Thema liegt (aus dem Kopf) auf Level 4, postfix-if dürfte "cruel" sein.
In der Regel würde ich Level 4+5 beseitigen wollen, ausgenommen manche Dinge, die im FHEM-Kontext wenig sinnvoll sind oder im konkreten Fall einfach überzogen, bei Level 3 kann man vermutlich so oder so votieren.
"Meine" Codes laufen (mit wenigen Pflastern) in der Regel bei bis Level-3-Checks (einschließlich) ohne Meckern durch, und die Dinge, die ich über diesen Weg gefunden hatte, waren praktisch alle ziemlich valide.

 Bei postfix-if geht es eigentlich v.a. um Lesbarkeit, und wenn da vorne ein "return" steht, macht mein Editor ein schönes Syntax-highlighting und es ist direkt sichtbar, dass hier eine "Ausgangstür" ist - Ziel (anders) voll erreicht. Darf ich ja entscheiden... 
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 01 November 2024, 14:29:00
https://forum.fhem.de/index.php?topic=139688

#####################################
#
# smartmatch replacement
#
#####################################

# use contains_<type>($scalar, @array) instead of $scalar ~~ @array
# requires List:Util
# see https://www.perlmonks.org/?node_id=1067462

sub contains_numeric($@) {
  my ($scalar, @array) = @_;
  return any { $_ == $scalar } @array;
}

sub contains_string($@) {
  my ($scalar, @array) = @_;
  return any { $_ eq $scalar } @array;
}
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: JoWiemann am 01 November 2024, 16:32:30
Hallo,

möchte dafür plädieren contains_numeric und contains_string in die 99_Utils zu übernehmen.

Grüße Jörg
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 01 November 2024, 17:28:32
Frage dazu:

Bringt die Unterscheidung in "numeric" und "string" irgend einen (performance-) Vorteil?

Bei "numeric" besteht sonst immer das Riskio, dass jemand gemischte Daten reinwirft (also kein rein numerisches Vergleichsarray) und man am Ende dann eine Ladung Fehlermeldungen hat...
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 01 November 2024, 17:30:48
Zitat von: Beta-User am 01 November 2024, 17:28:32Bringt die Unterscheidung in "numeric" und "string" irgend einen (performance-) Vorteil?

Es ist die Frage, welcher Vergleichsoperator ausgewählt werden soll, == oder eq.

Die Performance kommt von any statt grep.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 01 November 2024, 17:42:50
any ist einleuchtend.

eq klappt halt auch mit Zahlen, aber == wirft einen Fehler bei jedem nicht-numerischen Element im Array.
Daher die Frage, ob nicht eine Funktion (mit eq) ausreichend wäre.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 10 November 2024, 16:52:33
Die Funktion wäre ja dann contains_string()

An sich fände ich es gut, wenn beide Funktionen oder was noch besseres nach 99_Utils.pm oder nach fhem.pl käme. Liest Rudi hier mit?
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: rudolfkoenig am 10 November 2024, 17:20:14
ZitatLiest Rudi hier mit?
Ja, ich warte nur die Ende der Diskussion und eine klare Ansage ab :)
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: erwin am 10 November 2024, 19:18:46
Nachdem any nur ein true/false als Resultat liefert, wäre ich für "eq" - und nur eine function - am besten in fhem.pl
Gibts Nachteile/Pitfalls wenn man Zahlen mit eq vergleicht?
l.g. erwin
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 11 November 2024, 20:44:13
Zitat von: erwin am 10 November 2024, 19:18:46Gibts Nachteile/Pitfalls wenn man Zahlen mit eq vergleicht?

Ich habe ChatGPT gefragt. Hier der relevante Schnipsel aus der Antwort:

Zitat... kann unerwartetes Verhalten verursachen, weil eq die Werte als Strings interpretiert. In den meisten Fällen funktioniert es zufällig, wenn die Zahlen ähnlich formatiert sind, aber sobald z.B. führende Nullen oder unterschiedliche Formate vorhanden sind, könnte das Ergebnis falsch sein.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 12 November 2024, 20:28:06
Bei einer Abstimmung wäre ich auch dafür, BEIDE Funktionen zu implementieren. Und zwar sicherheitshalber in der fhem.pl, denn es gibt doch den einen oder anderen user, der seine 99_Utils.pm verhunzt.

Als Entwickler sollte man sich aber bei solchen grundlegenden Funktionen darauf verlassen können, dass sie auch wirklich vorhanden sind.

Es wird nach der Umstellung vermutlich ohnehin den einen oder anderen Supportfall geben, wenn Anwender ihr update nur unvollständig ausführen, weil sie beispielsweise mit exclude_from_update arbeiten. Aber man kann und sollte nicht jede Dummheit abfangen.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 30 November 2024, 12:50:00
Zitat von: Dr. Boris Neubert am 01 November 2024, 14:29:00https://forum.fhem.de/index.php?topic=139688 (https://forum.fhem.de/index.php?topic=139688)

#####################################
#
# smartmatch replacement
#
#####################################

# use contains_<type>($scalar, @array) instead of $scalar ~~ @array
# requires List:Util
# see https://www.perlmonks.org/?node_id=1067462

sub contains_numeric($@) {
  my ($scalar, @array) = @_;
  return any { $_ == $scalar } @array;
}

sub contains_string($@) {
  my ($scalar, @array) = @_;
  return any { $_ eq $scalar } @array;
}

Nachdem keine bessere Lösung vorgebracht wurde schlage ich nunmehr wie Udo vor, beide Funktionen in fhem.pl zu implementieren.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: rudolfkoenig am 30 November 2024, 19:55:15
Habs eingecheckt, allerdings mit etwas Bauchschmerzen wegen
use List::Util qw(any);
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 01 Dezember 2024, 11:06:59
Hallo Rudi,

würdest Du bitte die beiden neuen Funktionen noch in die Liste der "Forward declarations" am Anfang der fhem.pl aufnehmen? Diese Liste benutze ich gerne beim Suchen von passenden Funktionen :)

Danke!
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: rudolfkoenig am 01 Dezember 2024, 11:32:02
Erledigt.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: betateilchen am 01 Dezember 2024, 11:35:20
Zitat von: rudolfkoenig am 01 Dezember 2024, 11:32:02Erledigt.

Danke.

Zitat von: rudolfkoenig am 30 November 2024, 19:55:15mit etwas Bauchschmerzen wegen
use List::Util qw(any);

Inzwischen habe ich das Paket libscalar-list-utils-perl in die dependencies für das Debian-Paket von FHEM aufgenommen, damit sollte es zumindest bei Neuinstallation unter Debian und Derivaten keine Probleme geben.
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 01 Dezember 2024, 11:54:54
Zitat von: rudolfkoenig am 30 November 2024, 19:55:15Habs eingecheckt, allerdings mit etwas Bauchschmerzen wegen
use List::Util qw(any);
Sollte kein allzu großes Problem mehr sein, jedenfalls wenn ich das richtig zusammengefieselt habe:
{ Module::CoreList->first_release('List::Util', 1.33) }=>
5.019005
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Beta-User am 04 Dezember 2024, 10:04:51
Zitat von: Dr. Boris Neubert am 30 November 2024, 12:50:00Nachdem keine bessere Lösung vorgebracht wurde schlage ich nunmehr wie Udo vor, beide Funktionen in fhem.pl (https://fhem.pl/) zu implementieren.
Nimmst du die bitte aus Calendar wieder raus (https://forum.fhem.de/index.php?topic=139979.0)?
Titel: Aw: Smartmatch und andere experimentelle Perl-Features
Beitrag von: Dr. Boris Neubert am 04 Dezember 2024, 20:35:56
Zitat von: Beta-User am 04 Dezember 2024, 10:04:51
Zitat von: Dr. Boris Neubert am 30 November 2024, 12:50:00Nachdem keine bessere Lösung vorgebracht wurde schlage ich nunmehr wie Udo vor, beide Funktionen in fhem.pl (https://fhem.pl/) zu implementieren.
Nimmst du die bitte aus Calendar wieder raus (https://forum.fhem.de/index.php?topic=139979.0)?
getan