Hauptmenü

Reading splitten

Begonnen von stefan-dd, 21 Januar 2024, 12:42:37

Vorheriges Thema - Nächstes Thema

stefan-dd

Ich möchte ein reading aufsplitten.

Reading zum splitten hat 4 Stellen (4542)

Soll in reading a und reding b mit jeweils 2 Stellen getrennt werden.

Mein Versuch:a {(split //,ReadingsVal($name,"test","00"))[0]}Damit bekomme ich aber nur eine Stelle abgeteilt, Wie muss es für 2 Stellen aussehen?

Danke

MadMax-FHEM

#1
Mich wundert, dass du so tatsächlich nur eine Stelle bekommst...
Bzw. was bekommst du?
Immer die erste Ziffer?
Dann liegt das verm. an [ 0 ] ;)

Wenn du zu split liest, dann sollte dir klar sein, dass die Funktion anhand von Trennzeichen trennt.

Wenn deine Ziffern ohne irgendein Trennzeichen aneinander pappen, wie soll split splitten? ;)

Ich würde mal substr nehmen.
Da kannst du angeben, welche Teile du haben willst...
Mit Start und Länge..

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Ralli

Mit regular expression:

my $val = "1234";
$val =~ /(..)(..)/;
my $split1 = $1;
my $split2 = $2;
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

betateilchen

Zitat von: MadMax-FHEM am 21 Januar 2024, 12:53:14Wenn du zu split liest, dann sollte dir klar sein, dass die Funktion anhand von Trennzeichen trennt.
Wenn deine Ziffern ohne irgendein Trennzeichen aneinander pappen, wie soll split splitten?

Die Frage ist einfach zu beantworten und Deine Ansicht ist grundsätzlich falsch.
Vielleicht solltest Du auch nochmal zu split nachlesen?

Siehe offizielle Dokumentation zur perl Funktion split():

ZitatHowever, this:

my @x = split(//, "abc"); # ("a", "b", "c")
uses empty string matches as separators; thus, the empty string may be used to split EXPR into a list of its component characters.

Beispiel:

sub test {
  my $val = "1234";
  my @a = split(//,$val);
  Debug Dumper \@a;
}

funktioniert völlig einwandfrei und liefert als Ergebnis:

2024.01.21 13:48:48 1: DEBUG>$VAR1 = [
          '1',
          '2',
          '3',
          '4'
        ];
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MadMax-FHEM

Trotzdem geht dann was der TE will nicht einfach nur mit split.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

betateilchen

Zitat von: Ralli am 21 Januar 2024, 12:54:13Mit regular expression:

my $val = "1234";
$val =~ /(..)(..)/;
my $split1 = $1;
my $split2 = $2;


Das geht auch einfacher:

my ($a,$b) = $val =~ /(\d\d)(\d\d)/;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#6
Zitat von: MadMax-FHEM am 21 Januar 2024, 13:58:09Trotzdem geht dann was der TE will nicht einfach nur mit split.

Doch, das würde auch gehen. Aber mit regex ist es einfacher.

my @a = split(//,$val);
my $a = "$a[0]$a[1]";
my $b = "$a[2]$a[3]";

Man könnte $a und $b natürlich auch mit jeweils zwei split() Aufrufen und der Angabe des array-Index erzeugen.
Aber das wird dann schwer zu lesen, funktioniert trotzdem problemlos "nur mit split".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MadMax-FHEM

Zitat von: betateilchen am 21 Januar 2024, 13:59:37Doch, das würde auch gehen.
Das würde mich aber jetzt interessieren...
...man lernt ja nie aus.

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

betateilchen

Ich wusste, dass diese Frage kommt...
Siehe meinen vorherigen Beitrag, den ich gerade ergänzt habe.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: MadMax-FHEM am 21 Januar 2024, 12:53:14Dann liegt das verm. an
  • ;)
Um solche Effekte mit unerwünschten smileys zu verhindern, wenn man eigentlich "0 in eckigen Klammern" haben möchte, gibt es in den Optionen zum Beitrag das Feld, in dem man "Keine Smileys verwenden" ankreuzen kann. Das geht auch nachträglich noch.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

MadMax-FHEM

Zitat von: betateilchen am 21 Januar 2024, 14:05:28Ich wusste, dass diese Frage kommt...
Siehe meinen vorherigen Beitrag, den ich gerade ergänzt habe.

Dass es so geht ist klar aber ist halt nicht mit nur split ;)
Trotzdem danke :)

Ja das mit den ungewollten Smilies ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

betateilchen

Zitat von: MadMax-FHEM am 21 Januar 2024, 14:13:31aber ist halt nicht mit nur split

sub test {
  my $val = "1234";
  my $a = (split(//,$val))[0].(split(//,$val))[1];
  my $b = (split(//,$val))[2].(split(//,$val))[3];
  Debug "$a $b";
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!