print array ruby string perl split

array - ruby split



Cadenas vacías al comienzo y al final de la división (2)

Posible duplicado:
Dividir el problema en Ruby

En Ruby, cuando divido una cadena con un delimitador que coincide con el comienzo de la cadena, da una cadena vacía en la posición inicial de la matriz:

"abc".split(/a/) # => ["", "bc"]

pero cuando hago algo similar con un delimitador que coincide con el final de la cadena, no da una cadena vacía:

"abc".split(/c/) # => ["ab"]

Esto me parece inconsistente. ¿Hay alguna razón para tal especificación?

Editar Si va a ser compatible con la especificación de Perl, ya que en muu es la respuesta corta, entonces la pregunta sigue siendo la misma: ¿por qué es así en Perl? Y por esta razón, ahora también se convierte en una pregunta sobre Perl.


Del fino manual :

división (patrón = $ ;, [límite]) → anArray
[...]
Si se omite el parámetro de límite , se suprimen los campos nulos finales. Si el límite es un número positivo, como máximo se devolverá esa cantidad de campos (si el límite es 1, se devuelve la cadena completa como la única entrada en una matriz). Si es negativo, no hay límite para la cantidad de campos devueltos, y los campos nulos finales no se suprimen.

Por lo tanto, los "campos nulos" posteriores se suprimen porque la documentación dice que sí. Si desea la cadena vacía final, solicítela:

''abc''.split(/c/, -1) # [ ''ab'', '''' ]

¿Por qué se comportaría de esa manera? Probablemente porque coincide con el comportamiento split de Perl :

Si LIMIT es negativo, se trata como si fuera arbitrariamente grande; tantos campos como sea posible se producen.

y vemos que al usar un limit negativo, nuevamente, nos da la cadena vacía final:

$ perl -e ''print join(",", split(/c/, "abc")), "/n"'' ab $ perl -e ''print join(",", split(/c/, "abc", -1)), "/n"'' ab,

¿Por qué copiar el comportamiento de Perl? Pregúntale a Matz


Después de leer la especificación de AWK después de que mu es demasiado corta, llegué a sentir que la intención original para la split en AWK era extraer subcadenas que corresponden a campos, cada uno de los cuales termina con un signo de puntuación como,, . , y el separador se consideró algo así como un "carácter de fin de campo". La intención no era dividir una cadena simétricamente en el lado izquierdo y el lado derecho de cada posición de separación, sino que estaba terminando una subcadena en el lado izquierdo de una posición de separación. Bajo esta concepción, tiene sentido tener siempre una cuerda (incluso si está vacía) a la izquierda del separador, pero no necesariamente en el lado derecho del separador. Esto puede haber sido heredado de Ruby a través de Perl.