FHEMWEB: Sporadisch fehlende SVG-Plots mit plotfork

Begonnen von Flachzange, 06 September 2026, 11:57:33

Vorheriges Thema - Nächstes Thema

noansi

Hallo Rudolf,

danke!

Zitatich verstehe es aber noch nicht, wieso es crash-sicherer ist.
Weil perl nach meiner Erfahrung das 'if' in dem Konstrukt auch auf das 'my' bezieht und wenn die Bedingung nicht erfüllt ist, dann sind die 3 Variablen auch nicht deklariert, mit den damit verbunden Folgen.

In der Regel wird diese spezielle Bedingung erfüllt sein, sofern normale Header kommen. Deswegen fällt es bisher auch nicht auf.

Solche Konstrukte musstest Du auch schon an anderer Stelle korrigieren.
my ($method, $arg, $httpvers);
  ($method, $arg, $httpvers) = split(" ", $FW_httpheader[0], 3)
        if($FW_httpheader[0]);
  $method = "" if(!$method);
wäre die alternative Methode.

Gruß, Ansgar.

rudolfkoenig

ZitatWeil perl nach meiner Erfahrung das 'if' in dem Konstrukt auch auf das 'my' bezieht und wenn die Bedingung nicht erfüllt ist, dann sind die 3 Variablen auch nicht deklariert, mit den damit verbunden Folgen.
Das habe ich auch mal so im Kopf gehabt, aber nach einen kleinen Test sehe ich keinen Unterschied: in beiden Faellen kriege ich beim Verwenden "Use of uninitialized value".
Aber egal: deine Variante ist schoener, deswegen habe ich es auch uebernommen.

Sidey

Ich habe auch etwas gegrübelt, da split ja automatisch undef zuweist wenn es keine Elemente mehr gibt.
Das if verhindert, dann das Erzeugen der Variable.

Das If braucht man aber überhaupt nicht, weil einfach $FW_httpheader auf '' gesetzt werden kann, wenn es nicht definiert ist und $arg sowie $httpvers dann undef erhalten. Zumal es nicht exakt korrekt ist auf if ($FW_httpheader) zu prüfen. Das klappt nur, weil es keine Methode "0" gibt.


my ($method, $arg, $httpvers) = split(' ', $FW_httpheader[0] // '', 3);

Mir ist aber kein HTTP Aufruf bekannt, der ohne Mehtode funktioniert. Also alles nur Therorie.

Nutze: SIGNALDuino, Homematic, Raspberry Pi, MQTT, Alexa, Docker, AlexaFhem,zigbee2mqtt, tasmota

Maintainer von: SIGNALduino, SD_WS*, fhem-docker, alexa-fhem-docker, fhempy-docker, WebAuth, fhem-mcp, midea-mqtt, whatsmeow-mqtt, alexa-cookie-service
https://github.com/sidey79?tab=repositories

Roger

Moin,
vielen Dank für die Änderungen. Ich hatte auch ab und zu mal fehlende SVG-Plots (wenn viele Grafiken auf einer Seite waren). Das scheint nun weg zu sein.

//Roger
Zotac & RPIs mit 10*FHEM
2*HM-LAN, 2*JeeLink, 2*RS485, SignalESP
HomeMatic, PCA301 Komponenten, ModBus: Stromzähler, Fronius WR, Shelly, Victron

noansi

Der Hintergrund der if($FW_httpheader[0]) Abfrage ist mir nicht bekannt.
Semantisch erwünscht war ursprünglich vermutlich der Anteil if(defined($FW_httpheader[0])) ?

split(' ',macht nicht dasselbe wie
split(" ",split(" ", sieht 1 oder mehrere spaces als einen Trenner wohingegen split(' ', jedes einzelne space als Trenner sieht.

Dazu stelle ich mal an RFC Kenner die Frage, ob split(/[ \t]+/, an dieser Stelle noch richtiger wäre?

rudolfkoenig

Ich konnte gerade keinen Unterschied zwischen split(' ',...) und split(" ",...) feststellen, split(/[ \t]+/,...) verhaelt sich aber anders.
fhem> { join(",", split(" ", "  a  \tb  "))."<" }
a,b<
fhem> { join(",", split(' ', "  a  \tb  "))."<" }
a,b<
fhem> { join(",", split(/[ \t]+/, "  a  \tb  "))."<" }
,a,b<

noansi

Hallo Rudolf,

ZitatIch konnte gerade keinen Unterschied zwischen split(' ',...) und split(" ",...) feststellen
Die perl Doku sagt zu split https://perldoc.perl.org/functions/split
ZitatAs another special case, split emulates the default behavior of the command line tool awk when the PATTERN is either omitted or a string composed of a single space character (such as ' ' or "\x20", but not e.g. / /). In this case, any leading whitespace in EXPR is removed before splitting occurs, and the PATTERN is instead treated as if it were /\s+/; in particular, this means that any contiguous whitespace (not just a single space character) is used as a separator.
...
ZitatHowever, this special treatment can be avoided by specifying the pattern / / instead of the string " ", thereby allowing only a single space character to be a separator. In earlier Perls this special case was restricted to the use of a plain " " as the pattern argument to split; in Perl 5.18.0 and later this special case is triggered by any expression which evaluates to the simple string " ".

Das hatte ich nur auf " " bezogen verstanden. Und nicht auf ' '. Und anscheinend wurde das ab perl 5.18.0 geändert, weswegen Du keinen Unterschied siehst.

Gruß, Ansgar.