2012-02-06 32 views
8

Tengo un pequeño problema. Quiero dividir una línea en cada carácter de tubería encontrado usando el operador de división. Como en este ejemplo.división en el carácter de la tubería en Perl

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

Yo esperaría un ouput de 36 como awk división con el delimitador | retorno 36, pero en lugar de eso obtener 12, como si la división se detuvo en el carácter 1 en la línea.

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

Cualquier idea. He intentado muchas formas de citar el |, pero sin éxito. Muchas gracias de antemano.

Respuesta

16

Según split:

Por defecto, los campos principales vacíos se conservan y se arrastran los vacíos se eliminan.

es necesario especificar un límite negativo de la división para obtener los arrastran:

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

Así que muchas gracias. He hecho este tipo de divisiones tantas veces y nunca he caído en esta trampa antes. – saudic

+2

+1 - La mayoría de las personas no se dan cuenta de esto hasta que se encuentran con esta circunstancia exacta, y lo comprueban. Programáticamente, no hace ninguna diferencia. Si quiero probar si se define un valor 'if (defined $ my_array [$ field])' funcionará si hay o no una entrada '$ my_array [$ field]' cuyo valor no está definido o si no hay un campo definido '$ my_array [$ field]'. –

+2

"Programativamente", hay grandes diferencias. p.ej. 'for (@myarray)', 'join ($ sep, @myarray)', etc. – ikegami

Cuestiones relacionadas