FHEM Forum

FHEM => Automatisierung => Thema gestartet von: kadettilac89 am 27 März 2020, 14:27:31

Titel: notify: "$EVTPART1" requires explicit package name
Beitrag von: kadettilac89 am 27 März 2020, 14:27:31
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.";
}
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag von: Otto123 am 27 März 2020, 14:55:55
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
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag von: kadettilac89 am 27 März 2020, 15:22:10
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.";
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag von: rudolfkoenig am 27 März 2020, 15:36:47
EVTPART* ist fuer Trivial-Anwendungen.
Wenn man was Komplexeres baut, dann verwendet man split(" ", $EVENT).
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag 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
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag von: kadettilac89 am 27 März 2020, 18:32:17
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.
Titel: Antw:notify: "$EVTPART1" requires explicit package name
Beitrag von: Raymund am 27 März 2020, 19:05:36
Was nicht passt, wird passend gemacht  ::)