2011-01-07 17 views
5

De acuerdo con la perldoc, la sintaxis de división es:Perl patrón de división

split /PATTERN/,EXPR,LIMIT 

Pero el PATTERN también puede ser una cadena simple o doble cita: split "PATTERN", EXPR. ¿Qué diferencia hace?

Editar: Una diferencia que conozco es la división en las barras invertidas: split /\\/ vs split '\\'. La segunda forma no funciona.

+0

La diferencia que está viendo se debe a la interpolación. '/ \\ /' es un patrón que contiene una sola barra invertida. ''\\' 'es una cadena que contiene una sola barra invertida. Cuando esa cadena se interpreta como un patrón, es como si hubiera escrito '/ \ /', que no es válido. Para obtener el mismo comportamiento, debe doblar las barras diagonales inversas: ''\\\\' ' –

+0

@Michael: se llaman secuencias de escape de barra invertida, no de interpolación. –

Respuesta

6

Parece que lo usa como "una expresión para especificar patrones":

El patrón/patrón/ puede ser reemplazada con una expresión para especificar patrones que varían en tiempo de ejecución. (Para ello el tiempo de ejecución compilación de una sola vez, utilizar /$ variable de E/S.)

edición: Lo he comprobado con esto:

my $foo = 'a:b:c,d,e'; 
print join(' ', split("[:,]", $foo)), "\n"; 
print join(' ', split(/[:,]/, $foo)), "\n"; 
print join(' ', split(/\Q[:,]\E/, $foo)), "\n"; 

Excepto para el caso especial ' ', que se parece a una expresión regular.

+0

Un ejemplo donde no: 'split/\\ /' versus 'split '\\''. – planetp

+1

Para ser más precisos, 'split EXPR, ...' (donde EXPR no es literal '/.../') es más o menos equivalente a 'do {my $ pattern = EXPR; split/$ pattern /, ...} '(excepto el' '' 'caso especial). Es por eso que ''\\' 'no funciona; el '$ pattern' resultante contiene solo 1 barra diagonal inversa, y necesita 2 para tener una expresión regular válida. – cjm

0

Dos reglas observables:

  • el caso especial split(" ") es equivalente a split(/\s+/).
  • para todo lo demás (que parece-no me clavo), split("something") es igual a split(/something/)
+0

No lo trata con '\ Q \ E' en absoluto; simplemente lo trata como '/ algo /'. –

+0

Eso no es correcto. Una cadena se comporta como una expresión regular estándar. – krakover

+0

'split ''' es como 'split/\ s + /', excepto que el primero omite un campo vacío principal. – ysth

1

Creo que no hay ninguna diferencia. Un patrón de cadena también se interpreta como una expresión regular.

1
perl -e 'print join("-",split("[a-e]","regular"))'; 
r-gul-r 

Como ve, el delimitador se interpreta como una expresión regular, no como un literal de cadena.

Por lo tanto, es más o menos lo mismo, con una excepción importante: split(" ",...) y split(/ /,...) son diferentes.

Prefiero usar /PATTERN/ para evitar confusiones, es fácil olvidar que es una expresión regular de lo contrario.

2

PATTERN siempre se interpreta como ... bueno, un patrón, nunca como un valor literal. Puede ser una expresión regular o una cadena. Las cadenas se compilan para regexes. En su mayor parte, el comportamiento es el mismo, pero puede haber diferencias sutiles causadas por la doble interpretación.

La cadena '\\' solo contiene una barra diagonal inversa. Cuando se interpreta como un patrón, es como si hubiera escrito /\/, que no es válido:

C:\>perl -e "print join ':', split '\\', 'a\b\c'" 
Trailing \ in regex m/\/ at -e line 1. 

Ups!

Además, hay dos casos especiales:

  • El patrón vacío //, que se divide en la cadena vacía.
  • Un solo espacio ' ', que se divide en espacios en blanco después de recortar espacios en blanco iniciales o finales.

1. expresiones regulares se pueden suministrar ya sea en línea oa través de un /.../qr// cadena entre comillas precompilado.