PERL WARNING: Use of uninitialized value - aber Code funktioniert

Begonnen von balli1187, 03 Dezember 2021, 12:04:02

Vorheriges Thema - Nächstes Thema

balli1187

Hallo,

ich habe etwas Perl-Code in einem Notify, welches mir den Essensplan meiner Tochter aus dem Webportal de Kita zieht.
Das funktioniert soweit auch aber dennoch bekomme ich die oben genannten Fehlermeldung im Log.

Kann mir jemand erklären warum?
{
if ($wday == 5) {
my $url = ReadingsVal('OUT_Kita_Essen','portal_URL','');
my $kdnr = ReadingsVal('OUT_Kita_Essen','.kdnr','');
my $pw = ReadingsVal('OUT_Kita_Essen','.kdpw','');
my $regex = '<div><strong>(Vegetarisch|Vollkost 1|Vollkost 2|Pasta)</strong><br />(.*)</div>';
my $ret ='';
my $meal = 'keine Bestellung';
my $group = '';
my $date = '';

###### get Session cookie
my $cmd_cookies = "curl -c cookies.txt -d \"userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts\" $url";
# fhem("setReading at_Kita_Essensplan cmd_cookies $cmd_cookies");


for (my $ii=1; $ii < 15; $ii++) {
$date = POSIX::strftime("%d.%m.%Y",localtime(time+86400*($ii+2)));

###### get pages
my $cmd_page ="curl -b cookies.txt -d \"getCurrentDate=$date\" $url";
# fhem("setReading at_Kita_Essensplan cmd_page $cmd_page");
$ret = qx($cmd_page);

#--- parse page for meals and Write in Reading
($group,$meal) = ($ret =~ m[$regex]);
if ($meal eq '') {$meal = ' - '}
$meal =~ s/\(.*?\)//g;
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_Speise '. $meal);
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_daysleft '. sprintf("%d", $ii+2));
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_Date '. $date);
}

###### Logout and delete cookie
$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
qx($cmd_cookies);
qx("rm cookies.txt");
}
else {
for (my $ii=1; $ii<15; $ii++) {
my $days_left = ReadingsNum('OUT_Kita_Essen','t_'. sprintf("%03d", $ii) .'_daysleft','');
fhem('setReading OUT_Kita_Essen t_'. sprintf("%03d", $ii) .'_daysleft '. sprintf("%d", $days_left - 1));
}
}
}
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Beta-User

Also: Ein WARNING ist ein deutlicher Hinweis darauf, dass etwas nicht 100% korrekt ist, aber eben noch kein (kritischer) Fehler.

Leider kann man innerhalb eines notify nicht feststellen, welche Zeile das war, sonst kann man leichter feststellen, an was es konkret krankt. Da wäre myUtils-Code leichter zu debuggen.

Da wir hier im "will was lernen"-Bereich sind, vielleicht noch zwei Hinweise:
"qq"
Das macht es einfacher, Ausdrücke wie
my $cmd_cookies = "curl -c cookies.txt -d \"userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts\" $url";zu schreiben:
my $cmd_cookies = qq(curl -c cookies.txt -d "userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts" $url);

Und bei Schleifen finde ich
for (my $ii=1; $ii < 15; $ii++) {
weniger elegant wie
for my $ii (1..14) {
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Christoph Morrison

Was für eine Fehlermeldung genau bekommst du denn (das im Titel ist vermutlich nicht die komplette)?
Hast du mal einen Test ohne FHEM gemacht? Debug-Output eingebaut?

balli1187

#3
@Beta-User:
Ich könnte den Code auch in die myUtils verschieben, wenn das beim debuggen hilft... Da ich der Code ansich keinen Wiederverwendungswert hat, habe ich es bisher in dem at belassen.

Danke auch für die Style-Hinweise. War mir so nicht bekannt.

@Christoph_Morrison
das komplette Warning lautet
PERL WARNING: Use of uninitialized value $meal in string eq at (eval 1031102) line 27.
Kenne ich bisher so nur, wenn ich eine Variable vorher nicht mit my $meal initialisiert habe. Das ist ja aber zu beginne vorhanden.

Ohne FHEM habe ich nichts getetstet, weil ich nicht wüsste wie.
Was genau meinst du mit Debug-Output? Ich hatte anfangs einzelne Rückgabe in Readings geschrieben, um bspw. zu testen ob meine Befehle richtig zusammen gebaut werden. Andere Ausgaben habe ich nicht.

Edit:
Sit vielleicht ein ganz anderes Problem aber direkt nach dem Warning im Log erhalte ich eine ganze Menge Statistiken... Kriege ich die irgendwie weg? Was sagen mir diese Zahlen?
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 21643    0 21618  100    25  78610     90 --:--:-- --:--:-- --:--:-- 78416
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 21653    0 21628  100    25   124k    147 --:--:-- --:--:-- --:--:--  125k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 21658    0 21633  100    25   158k    187 --:--:-- --:--:-- --:--:--  159k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 21621    0 21596  100    25   157k    186 --:--:-- --:--:-- --:--:--  157k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    25    0     0  100    25      0    164 --:--:-- --:--:-- --:--:--   163
100 21629    0 21604  100    25   122k    145 --:--:-- --:--:-- --:--:--  122k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 20573    0 20548  100    25    99k    124 --:--:-- --:--:-- --:--:--   99k
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Beta-User

...dann dürfte das Problem aus dieser Zeile kommen:
if ($meal eq '') {$meal = ' - '}
Immer dann, wenn kein match vorliegt.
Versuche mal
$meal = ' - ' if !$meal;

"unwahr" ist bei Perl nämlich "0", leerer Text und "echtes undef"... Da hier wohl keine 0 kommt (?), sollte das klappen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

balli1187

Zitat von: Beta-User am 03 Dezember 2021, 14:13:27
...dann dürfte das Problem aus dieser Zeile kommen:
if ($meal eq '') {$meal = ' - '}
Immer dann, wenn kein match vorliegt.
Versuche mal
$meal = ' - ' if !$meal;

"unwahr" ist bei Perl nämlich "0", leerer Text und "echtes undef"... Da hier wohl keine 0 kommt (?), sollte das klappen...
Das hat geholfen. jedenfalls ist das Warning weg.


neben den Statistiken ist mir jetzt aber noch aufgefallen, dass die cookies.txt nicht gelöscht werden kann. Log
sh: 1: rm cookies.txt: not found
Passt die Pfadangabe nicht? Angelegt und genutzt wird die Datei ja im Hauptverzeichnis (/opt/fhem).
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

#7
qx("rm cookies.txt")
Ich denke es muss so:
qx(rm cookies.txt)
Ich habe dazu nur einen Verweis auf meine Notiz. :)
ZitatAchtung: Die Verwendung von qx("") führt zu einer Fehlermeldung, da ist offenbar ein String Terminator zu viel.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

balli1187

so einfach...
Danke Otto.

Wenn wir jetzt noch die Statistiken geklärt bekommen, bin ich durch ;-)
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero

Beta-User

$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
Hier würde ich trotzdem nochmal nach ".xt" sehen und vielleicht mal wieder "qq" ins Rennen werfen...

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

balli1187

Zitat von: Beta-User am 03 Dezember 2021, 14:49:50
$cmd_cookies = "curl -b cookies.xt $url" . '/logout.html';
Hier würde ich trotzdem nochmal nach ".xt" sehen und vielleicht mal wieder "qq" ins Rennen werfen...
habe ich angepasst, danke.
Witziger Weise führte das zu keinem Fehler, da es beim Logout scheinbar unnötig ist die cookies zu übergeben.
FHEM auf QNAP im docker, nanoCUL per ser2net an VU+, 2x Echo Dot, 3x HM-ES-PMSw1-Pl, 3x HM-LC-Bl1PBU-FM, 6x Sonoff Basic, div. "Shelly Eigenbauten" von Papa Romeo, ESPRGBWW-Controller, ...
Projekte: Smart Mirror in Spiegelschrank auf RPi Zero