2011-08-14 21 views
6

¿Cómo puedo convertir un escalar que contiene una cadena con saltos de línea en una matriz con esas líneas como elementos?escalar con las líneas de gama

Por ejemplo, teniendo en cuenta esto:

$lines = "line 1\nline 2\nline 3\n"; 

que desea recuperar este:

$lines[0] --> "line 1\n" 
$lines[1] --> "line 2\n" 
$lines[2] --> "line 3\n" 

Idealmente, me gustaría mantener la nueva línea en los elementos Aray.

Respuesta

2

Uso split:

my @lines = split(/\n/m, $lines); 

EDITAR: para mantener los saltos de línea, dividida en /^/m como se ha mencionado en los comentarios, o utilizar un ancho cero mirada detrás, como se ha mencionado en otra respuesta.

+0

Gracias. Por las dudas: ¿es posible mantener la nueva línea? Y lo siento, debería haberlo declarado en la respuesta más claramente. –

+5

Intenta dividir en '/ ^/m' en su lugar. –

+0

Gracias @Jim Davis, funciona bien. Cero coincidencia de ancho, idea inteligente. –

4

Una forma es utilizar split continuación map.

use warnings; 
use strict; 

my $lines = "line 1\nline 2\nline 3\n"; 
my @lines = map { "$_\n" } split /\n/, $lines; 
+1

Gracias herramienta, parece un poco avanzado para mí (principiante Perl) pero sin duda algo para investigar, nunca he utilizado el mapa. –

+1

De nada. Me tomó un tiempo para envolver mi 'mapa', pero ahora que lo tengo, lo uso con frecuencia. Piense en ello como realizar alguna operación en cada elemento de una matriz (o lista). En este caso, solo agrego '\ n' a cada línea. – toolic

+3

@nuevo 'mapa' es bastante útil, y en absoluto tan difícil como parece. Te puedo recomendar que aprendas a usarlo. – TLP

7

Puede utilizar un vistazo detrás negativo para preservar el carácter de nueva línea de fractura:

@lines = split /(?<=\n)/, $lines; 
+1

+1 Gran respuesta. –

3

Otra forma, sin split:

use warnings; 
use strict; 

my $lines = "line 1\nline 2\nline 3\n"; 
my @lines = $lines =~ /(.*\n)/g; 
+1

+1, simplemente impresionante. – sidyll

+0

Creo que esto perderá una línea en el extremo que no termina con una nueva línea. Quizás 'my @lines = $ lines = ~/(. * \ N?)/G;'? –

+0

@Joel, su código agregará un elemento vacío a la matriz '@ lines' para los datos de entrada del OP. Eso no es lo que quiere el OP. – toolic

Cuestiones relacionadas