2013-06-05 11 views
8

Próbuję podzielić ciąg znaków na tablicę z podziałem występującym w białych przestrzeniach. Każdy blok tekstu jest oddzielony licznymi (zmiennymi) spacjami.Zmienna dzielona na białej przestrzeni

Oto ciąg:

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

Próbowałem następujących bez powodzenia.

my @array1 = split//, $VAR1; 

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

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

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

Chciałbym skończyć z:

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

Jaki jest najlepszy sposób, aby podzielić to?

Dzięki!

+1

Ostatnia opcja powinna działać, więc domyślam się masz prawdopodobnie niektóre karty. – squiguy

+0

Jakie wyniki uzyskano z prób? Ostatnia używana metoda ma działać. – doubleDown

+0

@squiguy: '\ s' odpowiada zakładkom. Problem polega na tym, że Perl zwróci listę z wiodącym polem o zerowej długości, jeśli ciąg zaczyna się od separatora. – Borodin

Odpowiedz

21

Jeśli pierwszym argumentem dla split jest ciąg "" (spacja), jest on specjalny. Należy dopasować odstępy o dowolnej wielkości:

my @array1 = split ' ', $VAR1; 

(BTW, to jest prawie równoznaczne z ostatniej opcji, ale także usuwa wszelkie wiodącą spacje).

+1

+1 miłe .. nie wiedziałem tego. –

+0

To wydaje się działać! Dzięki – hallert

9

Wystarczy spróbować użyć:

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

Codepad Demo

Od Perldoc:

Jako inny specjalny przypadek, split emuluje domyślne zachowanie narzędzia awk awk, gdy pominięto WZORZEC lub literał ciąg złożony z pojedynczego znaku spacji (takiego jak "lub" \ x20 ", , ale nie np//). W tym przypadku, każdy prowadzący spacje w wyrażenie jest usunięte przed łupania wystąpić

+0

To działa również – hallert

4

\s+ mecze 1 lub więcej spacje i podział na nich

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

działa również. Być może moje wyniki były zróżnicowane, gdy testowałem, więc wyrzuciło mnie to. Wydaje się, że wszystkie odpowiedzi działają tutaj. – hallert