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.
Hi,
versuch mal so (als Test für die FHEM Kommandozeile)
{my $data='[123,"Test"],[124,"Test2"]';;(split('\[123',$data))[1]}
Gruß Otto
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...
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 :)
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 (https://perldoc.perl.org/functions/split)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]}