2012-02-06 11 views
8

Mam mały problem. Chcę podzielić linię na każdy znak potoku znaleziony przy użyciu operatora podziału. Jak w tym przykładzie.dzielenie na znak rurki w perl

echo "000001d17757274585d28f3e405e75ed|||||||||||1||||||||||||||||||||||||" | \ 
perl -ane '$data = $_ ; chop $data ; @d = split(/\|/ , $data) ; print $#d+1,"\n" ;' 

spodziewałbym się ouput 36 jako awk rozszczepienia z ogranicznikiem | powrotu 36, ale zamiast ja dostać 12, jakby zatrzymał się na rozłam 1 znaku w linii.

echo "000001d17757274585d28f3e405e75ed|||||||||||1|||||||||||||||||||||||||||||||||||||||" | \ 
awk -F"|" '{print NF}' 

Każdy pomysł. Próbowałem wielu sposobów cytowania |, ale bez powodzenia. Wielkie dzięki z góry.

Odpowiedz

16

Według split:

Domyślnie pusty prowadzące pola są zachowane, a te puste końcowe są usuwane.

Musisz podać ujemną granicę do rozłamu, aby uzyskać te spływu:

split(/\|/, $data, -1) 
+0

Więc wielkie dzięki. Robiłem tego rodzaju podziały tyle razy i nigdy wcześniej nie wpadłem w tę pułapkę. – saudic

+2

+1 - Większość ludzi nie zdaje sobie z tego sprawy, dopóki nie natkną się na tę okoliczność i sprawdzą. Programowo nie ma znaczenia. Jeśli chcę przetestować, czy wartość jest zdefiniowana 'if (zdefiniowany $ my_array [$ field])' będzie działać bez względu na to, czy faktycznie istnieje wpis '$ my_array [$ field]' którego wartość jest niezdefiniowana lub czy nie ma zdefiniowanego pola '$ my_array [$ field]'. –

+2

"Programowo", istnieją ogromne różnice. na przykład 'dla (@myarray)', 'join ($ sep, @ myarray)', itp – ikegami