Hauptmenü

[Erledigt] Perl Split

Begonnen von Det20, 29 Dezember 2020, 11:22:37

Vorheriges Thema - Nächstes Thema

Det20

Hallo,

ich habe mal eine ziemlich einfache, aber nervige Frage an die Profi's. Ich muss einen sehr langen String, zum Beispiel "[123,"Test"],[124,"Test2"] zerlegen, dafür möchte ich Split nutzen. Das Problem ist, dass ich mit split("[123",$data) eine Fehlermeldung bekomme, weil [ ja zu Regex gehört. Ich habe versucht, [ zu escapen, klappt aber leider weder mit \ noch mit /. Google hat mir auch kaum was ausgespuckt, vielleicht hat hier jemand einen schnellen, einfachen Tipp? Eigentlich brauche ich Regex an der Stelle überhaupt nicht.

Otto123

Hi,

versuch mal so (als Test für die FHEM Kommandozeile)
{my $data='[123,"Test"],[124,"Test2"]';;(split('\[123',$data))[1]}

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Beta-User

Du kannst auch die eckige Klammer als Zeichen in Regex schreiben, indem du es selbst in eckige Klammern kleidest (hinten ist es evtl. nicht erforderlich):
[[]([0-9]+),"([a-zA-Z0-9]+)"[]]
Im Ergebnis wird das aber trotzdem mit split ggf. etwas schwierig, weil der delimiter entfernt wird, also nicht mehr Bestandteil des Arrays ist, was hier vermutlich nicht gewünscht ist. Ergo müßte man den ggf. vorab verändern (ersetzen mit einem doppelten Komma, z.B.).
Meine Vermutung wäre, dass hier eine while-Schleife besser wäre, die solange läuft wie obige Regex passt und dann einen hash mit $1=>$2 aufbaut.

Aber ohne das "große ganze" ist das schwierig...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Det20

Zitat von: Otto123 am 29 Dezember 2020, 11:29:26
Hi,

versuch mal so (als Test für die FHEM Kommandozeile)
{my $data='[123,"Test"],[124,"Test2"]';;(split('\[123',$data))[1]}

Gruß Otto

Danke, das war's :)

Otto123

Ich hätte ja gern noch verstanden was genau der Unterschied zwischen "\[" und '\[' ist.
Ich weiß ja mittlerweile man sollte in erster Linie die einfachen 'string' Begrenzer nehmen und die doppelten "string" nur im Spezialfall.

Ich versuche an der Stelle im Kopf zu behalten, dass der Syntax laut perldoc eigentlich so aussieht:
split /PATTERN/,EXPR,LIMIT
und die Form mit '|" String Begrenzern eine Spezialform für Split darstellt.  :-[

Also mein Beispiel besser so:
{my $data='[123,"Test"],[124,"Test2"]';;(split(/\[123/,$data))[1]}
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz