2010-07-07 45 views
7

Tengo una matriz que contiene cadenas que pueden contener espacios en blanco añadidos al final. Necesito eliminar esos espacios usando script Perl. mi matriz se verá así¿Cómo puedo eliminar los espacios en blanco iniciales y finales de los elementos de la matriz?

@array = ("shayam "," Ram  "," 24.0  "); 

Necesito la salida como

@array = ("shayam","Ram","24.0"); 

he intentado con chomp (@array). No está funcionando con las cuerdas.

+1

duplicado: http://stackoverflow.com/questions/184590/is-there-a-perl-compatible-regular-expression-to-trim-whitespace- from-both-sides, http://stackoverflow.com/questions/2025658/how-do-i-remove-white-space-in-a-perl-string – Zaid

+0

En una matriz dada, cada índice contiene solo una cadena o múltiple cadenas también como @array = ("shayam nice", "Ram", "24.0"); ? –

+0

@Zaid: esos no son duplicados exactos de esto. Se trata de hacerlo para una lista de valores. –

Respuesta

1
 
#!/usr/local/bin/perl -w 

use strict; 
use Data::Dumper; 

my @array=('a ', 'b', ' c'); 

my @newarray = grep(s/\s*$//g, @array); 

print Dumper \@newarray; 

La función clave aquí es grep(), todo lo demás es solo demo gravy.

+5

¿No sería más apropiado 'map'? –

+0

mapa es más complejo de lo que se necesita aquí. Como sabes que la expresión regular siempre volverá a ser verdadera, mientras que al mismo tiempo se modifica $ _, grep es la mejor opción. Todas estas personas que están pasando con estos tontos bucles foreach claramente no han leído los primeros dos capítulos de cualquier perl libro básico. grep es pan y mantequilla para perl :) –

+2

(respuesta a Alan Horn) IMO 'grep' sugiere buscar algo en una lista, 'map' sugiere que se usará toda la lista, por lo tanto, usando 'grep' donde 'map' es más apropiado hace que el código sea menos legible de manera inmediata – plusplus

-1
my @res =(); 
my $el; 

foreach $el (@array) { 
    $el =~ /^\s*(.*?)\s*$/; 
    push @res, $1; 
} 

Después de esto, @res contendrá sus elementos deseados.

+4

Esto es unidiomatic Perl. – daxim

+2

@daxim: ¿Quieres decir porque puedes leerlo? Pensé que Perl tenía que ver con la libertad de elección. – Borealid

+2

Ridículo. Es solo una línea con 'map' o [' foreach' (como muestra Zaid)] (http://stackoverflow.com/questions/3192649#3192716), y por lo tanto más legible. 'mi $ el; foreach $ el ... 'es el estilo de un principiante sin escrúpulos, todos los demás escriben' foreach my $ el ... '. Además, [bicarbonato] (http://en.wikipedia.org/wiki/There's_more_than_one_way_to_do_it). Lo siento, no creo que tu respuesta sea tan buena y merece su falta de votos expresos. – daxim

32

La pregunta subyacente gira en torno a la eliminación de espacio inicial y final de las cadenas, y ha sido contestada en varios hilos en una forma u otra con la siguiente sustitución de expresiones regulares (o su equivalente):

s{^\s+|\s+$}{}g foreach @array; 

chomp La matriz eliminará solo los separadores de registros de entrada finales ("\n" de forma predeterminada). No está diseñado para eliminar espacios en blanco al final.

De perldoc -f chomp:

es a menudo utilizado para eliminar el salto de línea desde el final de un registro de entrada cuando se está preocupado de que el registro final puede faltar su nueva línea. Cuando está en modo de párrafo ($/ = ""), elimina todas las líneas nuevas de la cadena.

...

Si chomp una lista, cada elemento se masticaba, y se devuelve el número total de caracteres eliminados.

+1

Esta es la respuesta correcta. El OP está pidiendo que los elementos de la matriz se modifiquen en lugar de crear una nueva matriz. Además, las soluciones con captura, aunque no son incorrectas, son necesariamente más lentas. Consulte también perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f –

+0

El uso del '{}' como delimiter está cerca de snobbish :-) Pero para ser sincero, no sabía que fue aceptado ... haciendo [esta respuesta] (http://stackoverflow.com/questions/5770590/which-characters-can -be-used-as-regular-expression-delimiters) incompleto .. –

+0

podría usted o alguien, por favor, decirme dónde está esta sintaxis con un 'bloque' (o lo que es) antes de que se documente la palabra clave 'foreach'. La página perlsyn no menciona esta sintaxis, pero funciona. – user907860

-2

Creo que el ejemplo de Borealid debe ser:

my @array = ("shayam "," Ram "," 24.0 "); 
foreach my $el (@array) { 
    $el =~ s/^\s*(.*?)\s*$/\1/; 
} 
+0

"puede arrojar algunas sorpresas si hay espacios dentro de cada cuerda". ¿Cuáles son las sorpresas entonces? – bohica

+1

Evite usar '\ 1' en el RHS de la sustitución. Además, no hay necesidad de capturar aquí. Consulte perlfaq: http://perldoc.perl.org/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning%2fend-of-a-string%3f y perlre: http://perldoc.perl.org/perlre.html#Warning-on-%5c1-Instead-of-%241 –

1

¿Qué tal: @array = map {join(' ', split(' '))} @array;

+0

Si bien esto no se solicita, también comprime múltiples espacios internos, además de recortar los espacios iniciales y finales, y es la forma más eficiente de hazlo, según la receta 1.19, Perl Cookbook, 2nd Edition – lkench

1

La respuesta de mayor audiencia aquí se veía bien, pero es, francamente, no tan fácil de leer como podría ser . Agregué una cadena con espacios internos para mostrar que no se eliminaron.

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = ("shayam "," Ram  "," 24.0  ", " foo bar garply "); 

map { s/^\s+|\s+$//g; } @array; 

for my $element (@array) { 
    print ">$element<\n"; 
} 

La salida:

>shayam< 
>Ram< 
>24.0< 
>foo bar garply< 
Cuestiones relacionadas