FHEM > Perl für FHEM-User

PERL WARNING: Use of uninitialized value - aber Code funktioniert

(1/3) > >>

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?

--- Code: ---{
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));
}
}
}

--- Ende Code ---

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

--- Code: ---my $cmd_cookies = "curl -c cookies.txt -d \"userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts\" $url";
--- Ende Code ---
zu schreiben:

--- Code: ---my $cmd_cookies = qq(curl -c cookies.txt -d "userName=$kdnr&userPass=$pw&&authSubmit=Auf gehts" $url);
--- Ende Code ---

Und bei Schleifen finde ich

--- Code: ---for (my $ii=1; $ii < 15; $ii++) {
--- Ende Code ---
weniger elegant wie

--- Code: ---for my $ii (1..14) {
--- Ende Code ---

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:
@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

--- Code: ---PERL WARNING: Use of uninitialized value $meal in string eq at (eval 1031102) line 27.
--- Ende Code ---
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?

--- Code: ---  % 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
--- Ende Code ---

Beta-User:
...dann dürfte das Problem aus dieser Zeile kommen:

--- Code: ---if ($meal eq '') {$meal = ' - '}
--- Ende Code ---
Immer dann, wenn kein match vorliegt.
Versuche mal

--- Code: ---$meal = ' - ' if !$meal;
--- Ende Code ---

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln