2008-12-16 12 views

Respuesta

52
@array = ($string =~ m/../g); 

El operador de coincidencia de patrones se comporta de una manera especial en un contexto lista en Perl . Procesa la operación de forma iterativa, haciendo coincidir el patrón con el resto del texto después de la coincidencia anterior. Luego, la lista se forma a partir de todo el texto que coincidió durante cada aplicación de la coincidencia de patrones.

37

Si realmente debe utilizar split, puede hacerlo a:

grep {length > 0} split(/(..)/, $string); 

Pero creo que la forma más rápida sería con unpack:

unpack("(A2)*", $string); 

Ambos métodos tienen la "ventaja" que si la cadena tiene un número impar de caracteres, dará como resultado la última por su cuenta.

+0

Dado que parece que está trabajando con caracteres hexadecimales, este es un punto discutible, pero A solo funciona para caracteres ASCII. La división debería funcionar para cualquier codificación, pero es posible que desee agregar un/s a ​​la expresión regular para que "\ n" coincida con ".". –

+2

Debe ser 'a2', no' A2'. Las primeras tiras siguen el espacio en blanco, que en el mejor de los casos es superfluo. – ikegami

6

En realidad, para coger el extraño personaje, que desea hacer el segundo carácter opcional:

@array = ($string =~ m/..?/g); 
+1

sí, pero es mucho más lento que desempaquetar. – mat

5

El patrón pasado a split identifica lo que separa lo que desea. Si desea utilizar dividida, que tendría que utilizar algo así como

my @pairs = split /(?(?{ pos() % 2 })(?!))/, $string; 

o

my @pairs = split /(?=(?:.{2})+\z)/s, $string; 

Esos son soluciones bastante pobres. Mejores soluciones incluyen:

my @pairs = $string =~ /..?/sg; # Accepts odd-length strings. 

my @pairs = $string =~ /../sg; 

my @pairs = unpack '(a2)*', $string; 
Cuestiones relacionadas