Hallo,
die Frage richtet sich an Perl-Experten. Ein Event kann mehrere $EVTPART* haben (0, 1, 2, ...9). Wie kann ich in einem notify abfragen ob EVTPART1 existiert und Warnungen vermeiden? Wenn ich auf die Variable zugreife obwohl diese nicht existiert erhalte ich (zurecht) folgende Warnung. "Global symbol "$EVTPART1" requires explicit package name (did you forget to declare "my $EVTPART1"?)".
Ich kann natürlich für jedes einzelne Event ein eigenes Notify erstellen, ich möchte es aber im Sourcecode unterscheiden, außerdem ist dadurch das Interesse geweckt ... aus Entwicklersicht.
Danke schon mal.
Beispiel der notify-Definition.
myDbLog.*:.*
{
if ($EVENT ne $EVTPART0){
Log 1, "ne: event: .$EVENT., Part0: .$EVTPART0. Part1: .$EVTPART1.";;
} else {
Log 1, "eq: event: .$EVENT., Part0: .$EVTPART0.";;
}
}
Ich habe es mit "no warning" versucht, damit erhalte ich die Warnung trotzdem.
no warnings "uninitialized";
Log 1, "ne: event: .$EVENT., Part0: .$EVTPART0. Part1: .$EVTPART1.";
Auch die Prüfung auf "defined" bringt mir die Warnung.
if(defined($EVTPART1)){
Log 1, "ne: event: .$EVENT., Part0: .$EVTPART0. Part1: .$EVTPART1.";
} else {
Log 1, "eq: event: .$EVENT., Part0: .$EVTPART0.";
}
Hi,
ich habe mal sowas gemacht:
if (!defined $zeit) {$zeit=0}
Das funktioniert ohne Warnung.
Davor läuft eine Kalenderabfrage und die ist nach dem Systemstart leer/nicht da.
{my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);
Allerdings war die Warnung eine andere: PERL WARNING: Use of uninitialized value in addition (+) at (eval 1869) line 1.
Gerade gefunden:
defined ist nicht die richtige Abfrage siehe https://forum.fhem.de/index.php?topic=14059.0 vielleicht hilft der Link dort?
Ich bin kein Perlexperte :)
Gruß Otto
wie ich sehe hatte schon mal jemand genau die selbe Frage und keine richtige Lösung dazu gefunden. DAnke für den Link, den hab ich bei der Suche nicht gesehen ... wahrscheinlich wegen dem Alter zu weit hinten.
Wie Groby damals angemerkt hat, wäre es (für mich) besser alle EVTPART-Variablen initial anzulegen. Aber gibt sicher Gründe die dagegen sprechen ...
Dann muss ich mir eine Funktion schreiben die mir $EVENT splittet und verzichte auf die $EVTPART's ....
Edit. ... oder "no strict" für die Zuweisung ... kann man sicher eleganter lösen, für mich reichts erstmal.
my $T_EVTPART1 = "";
{
no strict; #no warning - "$EVTPART1" requires explicit package name
if(defined($EVTPART1)){ #no warning - "Use of uninitialized value $T_EVTPART1"
$T_EVTPART1 = $EVTPART1;
}
use strict;
}
Log 1, "ne: event: .$EVENT., Part0: .$EVTPART0. Part1: .$T_EVTPART1.";
EVTPART* ist fuer Trivial-Anwendungen.
Wenn man was Komplexeres baut, dann verwendet man split(" ", $EVENT).
Und wenn Du die RegEx so schreibst:
myDbLog.*:..+
(also mit ..+ am Ende)
dann sollte $EVTPART1 immer einen Wert beinhalten. Das kann man dann sicher noch verfeinern, z.B. mit \d+
Gruß
Raymund
Zitat von: Raymund am 27 März 2020, 17:19:45
Und wenn Du die RegEx so schreibst:
myDbLog.*:..+
(also mit ..+ am Ende)
dann sollte $EVTPART1 immer einen Wert beinhalten. Das kann man dann sicher noch verfeinern, z.B. mit \d+
Gruß
Raymund
Ist eine Alternative, wäre elegant zu schreiben. Dein Regex liefert keinen Wert an, habe es schnell mal tetestet, aber könnte mit entsprechendem Regex funktionieren. Habe es mit dem Weg oben gelöst, aber werde es mit nochmal mit Regex testen.
Was nicht passt, wird passend gemacht ::)