2010-09-14 14 views
21

Estaba notando un comportamiento curioso con el comando dividir de Perl, particularmente en los casos en que esperaría que la matriz resultante contenga cadenas vacías '', pero en realidad no es así.Perl dividido con delimitadores antes/después de texto vacío

Por ejemplo, si tengo un delimitador (es) al final (o el principio) de la cadena, la matriz resultante no tiene una cadena (s) vacía '' como el último (o primer) elemento.

Ejemplo:

@s = split(/x/, 'axb') 

produce 2 conjunto de elementos de [ 'a', 'b']

@s = split(/x/, 'axbx') 

produce misma matriz

@s = split(/x/, 'axbxxxx') 

produce misma matriz

Pero tan pronto como coloco algo t Al final, todas esas cadenas vacías aparecen como elementos:

@s = split(/x/, 'axbxxxxc') 

produce una matriz de 6 elemento [ 'a', 'b', '', '', '', 'c']

El comportamiento es similar si los delimitadores están al principio.

Espero que el texto vacío entre, antes o después de los delimitadores siempre produzca elementos en la división. ¿Alguien puede explicarme por qué la división se comporta así en Perl? Acabo de probar lo mismo en Python y funcionó como se esperaba.

Nota: Perl v5.8

Respuesta

44

De the documentation:

Por defecto, campos principales vacíos se conservan, y se eliminan los vacíos se arrastran. (Si todos los campos están vacíos, se considera que están detrás.)

Eso explica el comportamiento que está viendo con los campos finales. Por lo general, esto tiene sentido, ya que las personas a menudo son muy descuidadas en el rastreo del espacio en blanco, por ejemplo. Sin embargo, puede obtener los campos en blanco de cola si quieres:

split /PATTERN/,EXPR,LIMIT

Si el límite es negativo, se trata como si un arbitrariamente grande LÍMITE había sido especificado.

Así que para obtener todos los campos vacíos se arrastran:

@s = split(/x/, 'axbxxxxc', -1); 

(Asumo que cometió un error por descuido cuando se mira en líder en los campos vacíos - que sin duda se conservan Trate split(/x/, 'xaxbxxxx') El resultado tiene el tamaño.. 3.)

+4

Al citar de los documentos, incluya un enlace al documento correspondiente. Lo he agregado por ti esta vez. – cjm

+0

Guau, me siento bastante tonto por no ir directamente a los documentos. Y sí, tienes razón, debo haber cometido algún error descuidado cuando probé los espacios iniciales, simplemente intenté de nuevo y los encontré preservados.¡Gracias por la nota sobre poner el límite de -1, eso me ayudó! – Roman

+0

@cjm gracias; ¡Prometo que suelo hacerlo! – Cascabel

Cuestiones relacionadas