2013-06-05 10 views
8

Ich versuche, eine Zeichenfolge in ein Array mit der Aufspaltung in den weißen Räumen aufzuteilen. Jeder Textblock ist durch zahlreiche (variable) Leerzeichen getrennt. HierSplit-Variable auf Leerraum

ist der String:

NUM8   host01 1,099,849,993 1,099,849,992    1 

Ich habe versucht, die folgenden ohne Erfolg.

my @array1 = split//, $VAR1; 

my @array1 = split/+/, $VAR1; 

my @array1 = split /\s/, $VAR1; 

my @array1 = split /\s+/, $VAR1; 

Ich möchte mit am Ende:

$array1[0] = NUM8 
$array1[1] = host01 
$array1[2] = 1,099,849,993 
$array1[3] = 1,099,849,992 
$array1[4] = 1 

Was ist der beste Weg, dies zu spalten?

Danke!

+1

Die letzte Option funktionieren soll, so meine Vermutung ist, Sie haben einige Tabs dort möglicherweise. – squiguy

+0

Welche Ausgabe haben Sie von Ihren Versuchen erhalten? Die letzte von Ihnen verwendete Methode sollte funktionieren. – doubleDown

+0

@squiguy: '\ s' stimmt mit Tabs überein. Das Problem ist, dass Perl eine Liste mit einem führenden Feld mit der Länge Null zurückgibt, wenn die Zeichenfolge mit einem Trennzeichen beginnt. – Borodin

Antwort

21

Wenn das erste Argument zu split die Zeichenfolge '' (das Leerzeichen) ist, ist es speziell. Es sollte Leerzeichen jeder Größe passen:

my @array1 = split ' ', $VAR1; 

(BTW, es ist fast gleichbedeutend mit dem letzten Option, aber es entfernt auch alle führenden Leerzeichen.)

+1

+1 schön .. wusste das nicht. –

+0

Das scheint zu funktionieren! Dank – hallert

9

Versuchen Sie einfach mit:

my @array1 = split(' ',$VAR1); 

Codepad Demo

Von Perldoc:

Als weiteren Spezialfall emuliert emited das Standardverhalten des Befehlszeilentools awk, wenn das PATTERN entweder weggelassen wird oder eine literale Zeichenfolge, die aus einem einzelnen Leerzeichen (wie '' oder '\ x20 ", ) besteht nicht z //). In diesem Fall ist jedes führendes Leerzeichen in EXPR entfernt vor der Spaltung

+0

Dies funktioniert auch – hallert

4

\s+ Treffer für 1 oder mehr Leerzeichen auftreten, und Split auf sich

my @array1 = split /\s+/, $VAR1; 
+0

funktioniert auch. Vielleicht hat sich mein Output während des Tests verändert, also hat er mich abgewimmelt. Scheint alle Antworten hier funktionieren. – hallert