2008-12-16 7 views

Antwort

52
@array = ($string =~ m/../g); 

Der Pattern-Matching-Operator verhält sich in besonderer Weise in einem Listenkontext in Perl . Es verarbeitet die Operation iterativ und gleicht das Muster mit dem restlichen Text nach der vorherigen Übereinstimmung ab. Dann wird die Liste aus dem gesamten Text gebildet, der bei jeder Anwendung des Mustervergleichs übereinstimmt.

37

Wenn Sie wirklich split verwenden müssen, können Sie tun:

grep {length > 0} split(/(..)/, $string); 

Aber ich denke, der schnellste Weg, mit unpack wäre:

unpack("(A2)*", $string); 

Beide Methoden, um den „Vorteil“ haben, dass Wenn die Zeichenkette eine ungerade Anzahl von Zeichen hat, gibt sie die letzte aus.

+0

Da es so aussieht, als ob er mit Hexadezimalzeichen arbeitet, ist dies ein wenig strittiger Punkt, aber A funktioniert nur für ASCII-Zeichen. Der Split sollte für jede Kodierung funktionieren, aber Sie sollten der Regex ein/s hinzufügen, damit "\ n" mit "." Übereinstimmt. –

+2

Sollte 'a2', nicht' A2' sein. Der vorherige Streifen hinterlässt Leerzeichen, was im besten Fall überflüssig ist. – ikegami

6

Eigentlich die ungeraden Zeichen zu fangen, möchten Sie das zweite Zeichen optional machen:

@array = ($string =~ m/..?/g); 
+1

yup, aber es ist viel langsamer als das Auspacken. – mat

5

Das Muster zu split identifiziert, was trennt das, was Sie wollen, übergeben. Wenn Sie Split verwenden wollten, würden Sie so etwas wie

my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string; 

oder

my @pairs = split /(?=(?:.{2})+\z)/s, $string; 

Das sind ziemlich schlechte Lösungen verwenden. Zu den besseren Lösungen gehören:

Verwandte Themen