Autor Thema: PERL WARNING: Use of uninitialized value - aber Code funktioniert  (Gelesen 1608 mal)

Offline balli1187

  • Sr. Member
  • ****
  • Beiträge: 739
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

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18139
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #1 am: 03 Dezember 2021, 12:30:29 »
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-T620@Debian 11, 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

Offline Christoph Morrison

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1817
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #2 am: 03 Dezember 2021, 12:33:18 »
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?

Offline balli1187

  • Sr. Member
  • ****
  • Beiträge: 739
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #3 am: 03 Dezember 2021, 14:04:39 »
@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
« Letzte Änderung: 03 Dezember 2021, 14:12:45 von balli1187 »
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

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18139
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #4 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...
Server: HP-T620@Debian 11, 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

Offline balli1187

  • Sr. Member
  • ****
  • Beiträge: 739
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #5 am: 03 Dezember 2021, 14:34:05 »
...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 foundPasst 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

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18139
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #6 am: 03 Dezember 2021, 14:38:28 »
".xt" ne ".txt"?
Server: HP-T620@Debian 11, 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

Offline Otto123

  • Tester
  • Hero Member
  • ****
  • Beiträge: 20803
  • schon mal restore trainiert?
    • Otto's Technik Blog
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #7 am: 03 Dezember 2021, 14:41:23 »
qx("rm cookies.txt")Ich denke es muss so:
qx(rm cookies.txt)Ich habe dazu nur einen Verweis auf meine Notiz. :)
Zitat
Achtung: Die Verwendung von qx("") führt zu einer Fehlermeldung, da ist offenbar ein String Terminator zu viel.
« Letzte Änderung: 03 Dezember 2021, 14:44:18 von Otto123 »
Viele Grüße aus Leipzig
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7490+7412,WRT1900ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266

Offline balli1187

  • Sr. Member
  • ****
  • Beiträge: 739
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #8 am: 03 Dezember 2021, 14:47:36 »
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

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18139
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #9 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...

Server: HP-T620@Debian 11, 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
Zustimmung Zustimmung x 1 Liste anzeigen

Offline balli1187

  • Sr. Member
  • ****
  • Beiträge: 739
Antw:PERL WARNING: Use of uninitialized value - aber Code funktioniert
« Antwort #10 am: 03 Dezember 2021, 15:56:01 »
$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