Fehler mit perl v5.24.1: Experimental each on scalar is now forbidden

Begonnen von kaihs, 12 Oktober 2016, 23:32:27

Vorheriges Thema - Nächstes Thema

herrmannj

nun ja - am Ende muss das jeder Autor für sich entscheiden. Die Meldungen "experimental" und "depraced" gibt es dazu lange genug.

Ein Autor sollte wissen wann und warum er "no warnings" einsetzt und wenn er das tut dann hat er vermutlich eine Grund. Für viele Ausnahmen (refs, redefine etc) gibt es ja durchaus legitime Gründe. (für warnings  fällt mir keiner ein)

vg
joerg

betateilchen

Zitat von: herrmannj am 08 November 2016, 20:52:31
Für viele Ausnahmen (refs, redefine etc) gibt es ja durchaus legitime Gründe.

jepp :)

Zitat von: herrmannj am 08 November 2016, 20:52:31
(für warnings  fällt mir keiner ein)

mir schon: unbedarfte fhem user, die bei jeder WARNING in ihrem Logfile sofort in Panik geraten und das Forum mit "Fehler-Threads" überschwemmen, weil sie eine Warnung nicht von einem Fehler unterscheiden können (oder wollen).
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

naja, idr kann der Autor dort ja genauso gut die Ursache der Warnung entfernen (undefined zb: $var||'' )

Dr. Boris Neubert

Ich achte mittlerweile tunlichst darauf, keine Warnungen zu erzeugen, um keine Anfragen von verunsicherten Usern zu bekommen. Aber ich sehe nicht jeden Anwendungsfall voraus und die meisten Warnungen kommen bei meinen Modulen aus der Konkatenation mit undef.

Bewusst schalte ich nur experimental aus. Habe ich irgendwo überlesen, dass experimentelle Sprachfeatures wieder entfernt werden? Ich nutze sehr gerne den ~~-Operator - ist ein sehr nützliches Ding. Aber ich will nicht jeden Monat einen Beitrag lesen, was die Warnung im Log denn bedeute.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

herrmannj

ich kann die Quelle nicht mehr benennen, aber ja:

experimental wird gekennzeichnet weil die Konstrukte nicht vollständig auf Nebenwirkungen getestet sind und weil nicht sicher ist das die features Bestand haben. Die Liste der wieder abgeschalteten features ist sogar beachtlich lang.

Für mich zb ein Grund smartmatches (so schön die auch sind) nicht zu verwenden und bei bei each verwende ich deswegen die (minimal) umständlichere de-referenzierte Variante. Bzgl der warning bin ich allerdings auch sehr pedantisch veranlagt, Daher verwende ich auf das $var||'' construct an Stellen wo ein undef (Beispiel log) vorkommen kann. In Summe empfinde ich das auch sehr gut. Es kommt durchaus vor das ich im log über eine warning stolpere und dadurch eigene Fehler (idr Logik) identifiziere

vg
joerg

justme1968

achtung: mit $var|| das macht nicht immer was du möchtest da die linke seite nicht auf defined geprüft wird sondern auf true. d.h. wenn $var 0 oder '' ist ist die rechte seite das ergebniss. das kann, muss aber nicht das beabsichtigte sein.

um auf defined zu prüfen gibt es $var//. aber leider nicht in äderten perl versionen.

zu den experimental features: ja. es sind einige schon mal wieder rausgeflogen oder haben sich (was noch schlimmer ist) in ihrer logik/funktion/verhalten geändert.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

herrmannj

Zitatwenn $var 0 oder '' ist ist die rechte seite das ergebniss.
ja absolut, Danke. Vergesse manchmal das solche threads als Orientierung dienen.

Die komplette Kette besteht aus der Überlegung ob ich eine Zahl oder einen Text erwarte:

numerisch: $var||0
string: $var||''     (führt bei string $var = '0' zur einer Abweichung)

Alternativ (etwas umständlicher) kann man unklare Fälle so behandeln:
$var = defined($var)?$var:'hier könnte ihre Werbung stehen'; # ggf anderer Text ;)

vg
joerg

Dr. Boris Neubert

Zitat von: herrmannj am 09 November 2016, 23:31:08
Für mich zb ein Grund smartmatches (so schön die auch sind) nicht zu verwenden und bei bei each verwende ich deswegen die (minimal) umständlichere de-referenzierte Variante.

Was meinst Du bzw. wie geht das?

Ich verwende smartmatch ausschließlich zur Prüfung, ob ein Skalar in einem Array aufgeführt ist.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Zitat von: Dr. Boris Neubert am 09 November 2016, 20:42:55
Ich nutze sehr gerne den ~~-Operator - ist ein sehr nützliches Ding.

Aber für die perl-Performance eine absolute Katastrophe.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 12 November 2016, 11:27:54
Aber für die perl-Performance eine absolute Katastrophe.

Wie würdest Du effizient (knackiger, performanter Code) prüfen, ob ein Skalar in einem Array enthalten ist?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

justme1968

das hängt doch vom kontext ab.
- wenn es oft vorkommt und sich das array selten/nicht ändert -> besser (zusätzlich) hash statt array verwenden und darüber suchen
- wenn man das array sortieren kann -> binäre (oder andere) suche
- sonst einfach mit grep -> if( grep {$_ eq $var} @array ) {...}

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968