Hallo,
ich habe folgende Fehlermeldung(en) im log:
PERL WARNING: Use of uninitialized value within @valp in string at ./FHEM/99_myUtils.pm line 40X.
Hir die Routine dazu:
sub departure4 {
my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
my $result = GetFileFromURL($url);
my @valp = split(/,/,$result);
map {$_ =~ s/[\[\]"]//g; } @valp;
for (my $i=0;$i<3;$i++) {
my $l = "$valp[$i*3]";
my $z = "$valp[($i*3)+1]";
my $dz = "$valp[($i*3)+1]";
my $m = "$valp[($i*3)+2]";
if ( $l == 551) {
$dz=~s/Bahnhof/\Bahnhof über Passage/};
if ( $l == 598) {
$dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
fhem("setreading departuresPo Linie$i $l",1);
fhem("setreading departuresPo Ziel$i $z",1);
fhem("setreading departuresPo displayZiel$i $dz",1);
fhem("setreading departuresPo Min$i $m",1);
}
}
Ich vermute, das es damit zusammenhängt, weil zu bestimmten Zeiten keine daten vorhanden sind. Kann man das "abfangen" und die Variable $valp dann anders belegen oder die Verabeitung unterbinden, sowas wie
next unless
matze1999
Hi,
Du kannst den Perl Operator "or ||" oder "defined or // " verwenden.
Beispiel:
my $os_name = $ua->os_string() || 'No OS';
Gruß Otto
Hallo,
danke, ich weiss nicht wie, hab jetzt überall an jede Zeile wo "$valp" vorkam oder hinter "my @valp"
|| 'leer'
angefügt.
Fehler bleibt.
so
sub departure4 {
my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
my $result = GetFileFromURL($url);
my @valp = split(/,/,$result);
map {$_ =~ s/[\[\]"]//g; } @valp;
for (my $i=0;$i<3;$i++) {
my $l = "$valp[$i*3]" || 'leer';
my $z = "$valp[($i*3)+1]" || 'leer';
my $dz = "$valp[($i*3)+1]" || 'leer';
my $m = "$valp[($i*3)+2]" || 'leer';
if ( $l == 551) {
$dz=~s/Bahnhof/\Bahnhof über Passage/};
if ( $l == 598) {
$dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
fhem("setreading departuresPo Linie$i $l",1);
fhem("setreading departuresPo Ziel$i $z",1);
fhem("setreading departuresPo displayZiel$i $dz",1);
fhem("setreading departuresPo Min$i $m",1);
}
}
die erste Fehlermeldung aus der Zeile
map {$_ =~ s/[\[\]"]//g; } @valp;
bekomme ich so weg:
map {$_ = '' unless defined $_; $_ =~ s/[\[\]"]//g; } @valp;
nur hier weiss ich nicht weiter:
for (my $i=0;$i<3;$i++) {
my $l = "$valp[$i*3]";
my $z = "$valp[($i*3)+1]";
my $dz = "$valp[($i*3)+1]";
my $m = "$valp[($i*3)+2]";
my @valp = split(/,/,$result);
Du musst einfach hier was sinnvolles reinschreiben. Ich weiß leider nicht was das wäre. :) und ob $result an der Stelle wirklich undefined ist?
my @valp = split(/,/,$result) // split(/,/,'willi,lustig,1,2,3,4,5');
Hallo Otto,
vielen dank, aber ich bekomme das nicht hin.
Wenn nichts fährt: @valp enthält nur einen Wert ("EFA error status: OK") statt der erwarteten drei Abfahrten (mit Linie, Ziel und Zeit). Kann man damit das abfangen?
matze1999
Naja aber wenn Du "EFA error status: OK" mit einem Split am Komma zerlegen willst wo gar keines ist? Das verstehe ich nicht.
Oder ist es sonst eine liste mit kommas getrennt?
Hallo,
mein fehler:
wenn Abfahrten sind dann sehen die Daten so aus:
[["579","Bahnhof","26"],["579","Bahnhof","57"],["579","Bahnhof","87"]]
Wenn keine Abfahrten sind, steht das o.g.:
EFA error status: OK
Das split Ergebnis ist dann für das erste Reading "EFA error status: OK" und alle anderen bleiben auf dem alten Stand.
Und im log erscheint die Fehlermeldung
uninitialized value
Weil ja die restlichen 8 Werte nicht vorhanden sind.
matze1999
dann man doch am Anfang einfach die Abfrage if ($result eq 'EFA error status: OK') und mach eine "Fehlerbehandlung" mit anschließendem return.
Oder mach eine for (@valp) {} Schleife wenn es egal ist ob die anderen Readings alte Werte haben.
@Otto,
so einfach:
sub departure4 {
my $url = "https://transport.stefan-biermann.de/publictransportapi/rest/departure/FHEM?from=900415116&provider=Vbb";
my $result = GetFileFromURL($url);
my @valp = split(/,/,$result);
if ($result ne 'EFA error status: OK') {
map {$_ =~ s/[\[\]"]//g; } @valp;
for (my $i=0;$i<3;$i++) {
my $l = "$valp[$i*3]";
my $z = "$valp[($i*3)+1]";
my $dz = "$valp[($i*3)+1]";
my $m = "$valp[($i*3)+2]";
if ( $l == 551) {
$dz=~s/Bahnhof/\Bahnhof über Südpassage/};
if ( $l == 598) {
$dz=~s/Gasthaus/Fürstl\. Drehna ü\. Pießig /};
fhem("setreading departuresPo Linie$i $l",1);
fhem("setreading departuresPo Ziel$i $z",1);
fhem("setreading departuresPo displayZiel$i $dz",1);
fhem("setreading departuresPo Min$i $m",1)};
} else
{
fhem("setreading departuresPo Linie0 EFA","EFA");
}
}
Das letzte reading nutze ich an anderer Stelle zur Auswertung, deshalb bleibt es mit "EFA" drin.