strawberry logo lane historia example compilador perl

logo - Perl dividido con texto vacío antes/después delimitadores



perl vs python (1)

Estaba notando algún comportamiento curioso con el comando dividido de Perl, particularmente en los casos en que esperaría que la matriz resultante contuviera cadenas vacías '''', pero en realidad no lo hace.

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

Ejemplo:

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

produce una matriz de 2 elementos [''a'', ''b'']

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

produce la misma matriz

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

produce la misma matriz

Pero tan pronto como pongo algo al final, todas esas cadenas vacías aparecen como elementos:

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

produce una matriz de 6 elementos [''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 produzca siempre elementos en la división. ¿Alguien puede explicarme por qué la división se comporta así en Perl? Acabo de intentar lo mismo en Python y funcionó como se esperaba.

Nota: Perl v5.8


De la documentación :

De forma predeterminada, los campos iniciales vacíos se conservan y los que se arrastran vacíos se eliminan. (Si todos los campos están vacíos, se considera que están al final).

Eso explica el comportamiento que estás viendo con los campos finales. Esto generalmente tiene sentido, ya que las personas a menudo son muy descuidadas con los espacios en blanco, por ejemplo. Sin embargo, puede obtener los campos en blanco al final si desea:

split /PATTERN/,EXPR,LIMIT

Si LIMIT es negativo, se trata como si se hubiera especificado un LIMIT arbitrariamente grande.

Así que para obtener todos los campos vacíos finales:

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

(Supongo que cometió un error por descuido al mirar los principales campos vacíos, definitivamente se conservan. Pruebe split(/x/, ''xaxbxxxx'') . El resultado tiene un tamaño 3.)