FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TomLee am 12 Mai 2021, 14:50:14

Titel: (geklärt) Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 14:50:14
Hallo,

ja im Anfängerbereich ...

Wenn ich hier missed_call: 0123456789 (Willi Mueller) einfach nur am Doppelpunkt splitte:
{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:/,$EVENT);; return $mc[1]}
bekomme ich mit $mc[1]
0123456789 (Willi Mueller)
zurück, das Leerzeichen vor der Nummer wird nicht in das Array mit übergeben.

Ich hätte erwartet das ich es mit :. splitten muss
{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:./,$EVENT);; return $mc[1]}
dass das Leerzeichen nicht mit übergeben wird.

Weil wenn ich zwei Zeichen nach dem Doppelpunkt splitte
{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:../,$EVENT);; return $mc[1]}
das Leerzeichen ja mitgezählt wird:
123456789 (Willi Mueller)

Versteht mich wer und kanns mir erklären warum das so ist/was ich bei der Übergabe noch nicht verstanden habe ?

Gruß

Thomas



Titel: Antw:Frage zu split
Beitrag von: Beta-User am 12 Mai 2021, 15:32:04
...scheint normal zu sein, dass das Leerzeichen speziell behandelt wird:
ZitatAn empty leading field is produced when there is a positive-width match at the beginning of EXPR. For instance:
print join(':', split(/ /, ' abc')), "\n";
produces the output :abc. However, a zero-width match at the beginning of EXPR never produces an empty field, so that:
print join(':', split(//, ' abc'));
produces the output  :a:b:c (rather than : :a:b:c).
(aus https://perldoc.perl.org/functions/split).
Titel: Antw:Frage zu split
Beitrag von: JoWiemann am 12 Mai 2021, 15:35:21
Hm,

wenn ich:


{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:/,$EVENT);; return "TestLeer" . $mc[1]}


ausführe, bekomme ich: TestLeer 0123456789 (Willi Mueller) als Ergebnis. Ist es also eher an Anzeigeproblem?

Grüße Jörg
Titel: Antw:Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 15:49:07
Es gibt gar kein Problem, ich möchte nur verstehen warum man einfach am Doppelpunkt splitten kann und das Leerzeichen ignoriert/nicht mit übergeben wird.
Vlt. ist das ja auch normal das bei der Übergabe in ein Array die Leerzeichen ausgelassen/nicht übergeben werden und mir fällt das heute erst bewusst auf ?
Titel: Antw:Frage zu split
Beitrag von: Beta-User am 12 Mai 2021, 15:56:28
Na ja, das Seltsame ist ja, dass man mit JoWiemann's Test ein Leerzeichen reinbekommt, aber mit dem hier auch nur _ein_ Leerzeichen:
{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:/,$EVENT);; return "1 $mc[1]"}

(Man könnte meinen, an der Stelle kommt  durch, dass Perl irgendwie doch den Schwerpunkt auf einer Art "Sprachverarbeitung" hat, die an der Stelle irgendwie was "hinmogelt", das _vermutlich_ zu den Erwartungen des Code-Erstellers paßt... )
Titel: Antw:Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 15:57:49
Ups, Tatsache ich hab mir das Beispiel nicht richtig angeschaut gehabt.

{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:/,$EVENT);; return "TestLeer".$mc[1]}

Dann ist das Leerzeichen vorhanden.

Wenn ich es mit return in FHEMWEB ausgeben lasse ist es nicht vorhanden, mit print im Log dann schon:

{ my $EVENT= 'missed_call: 0123456789 (Willi Mueller)';;my @mc = split (/:/,$EVENT);; print $mc[1]}

Ergebnis:
0123456789 (Willi Mueller)

Zieh ich für mich raus das nächste mal mit print zu testen oder gleich in Eclipse.
Titel: Antw:Frage zu split
Beitrag von: JoWiemann am 12 Mai 2021, 16:00:28
Ah, FhemWeb. Führende Leerzeichen werden doch im HTML nicht angezeigt. Dafür muss ich doch ein dann ein:


 


sein.

Grüße Jörg
Titel: Antw:Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 16:04:16
Damit hast du wohl recht, genauso wie in dem letzten Code-Tag von mir  ;D
Titel: Antw:Frage zu split
Beitrag von: Beta-User am 12 Mai 2021, 16:06:21
(das schlägt wohl auch durch, wenn mehrere Leerzeichen zwischendurch auftauchen...)
Titel: Antw:(geklärt) Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 16:41:38
Ist ja jetzt geklärt, anderes Thema, aber immer noch Leerzeichen betreffend und das ist mein Thread.

Was ist hier jetzt ursächlich dass das Leerzeichen nach dem Doppelpunkt in der APP "gefressen" wird, auch HTML (der APP) ?

defmod not_cm_example_missedcall notify cm_example:missed_call:.* {\
my @mc = split (/:/,$EVENT);;\
return fhem("set tb_TelegramBot msg Verpasster Anruf:$mc[1]")}


oder so

defmod not_cm_example_missedcall notify cm_example:missed_call:.* {\
my @mc = split (/:/,$EVENT);;\
return fhem("set tb_TelegramBot msg Verpasster Anruf: $mc[1]")}


macht keinen Unterschied, es gibt immer nur ein Leerzeichen, das aus dem Array.
Titel: Antw:(geklärt) Frage zu split
Beitrag von: Beta-User am 12 Mai 2021, 16:47:47
Ich vermute: Es war da, ist aber später einem anderen split zum Opfer gefallen, nämlich einem, das "ein oder mehrere Leerzeichen" als Trenner verwendet (wie das bei der Analysen von FHEM-Befehlen häufig gemacht wird).
Titel: Antw:(geklärt) Frage zu split
Beitrag von: TomLee am 12 Mai 2021, 16:54:08
Ich meine du hast mich missverstanden, es geht jetzt nicht um den Doppelpunkt im split sondern um das Leerzeichen nach dem Doppelpunkt im FHEM-Befehl nach Anruf.
Titel: Antw:(geklärt) Frage zu split
Beitrag von: Beta-User am 12 Mai 2021, 17:03:00
Schon klar, dass es um das fehlende 2. Leerzeichen geht, nicht den Doppelpunkt.

Viele/die meisten SetFn verwenden einen split-Befehl, um die Elemente zu trennen (oder (wenige) alternativ: parseParams (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#parseParams)). Und da geht es eigentlich immer vorrangig um 1+Leerzeichen.
Leider finde ich grade kein passendes Beispiel...