Perl: función para recortar los espacios en blanco iniciales y finales de la cadena

82

¿Existe una función incorporada para recortar los espacios en blanco iniciales y finales trim(" hello world ") eq "hello world"?

Landon Kuhn
fuente
3
FYI: el operador prueba la igualdad de cadenas en Perl eq.
A. Rex
5
Un poco de aclaración sobre todas las respuestas que obtuvo: s/^\s+|\s+$//g;vs s/^\s*//; s/\s*$//;La última es la forma (ligeramente) más idiomática de hacer esto, ya que iniciar el motor de expresiones regulares es en realidad más rápido que la alternancia, en este caso. Puede leer más sobre esto en Dominar las expresiones regulares de Jeffrey Friedl. (A menos que esto se haya solucionado en alguna versión más reciente de Perl, en cuyo caso, ¡alguien me corrija!)
Hugmeir
4
Viniendo de un entorno de Java y .NET, ¡casi me sorprende que esto no esté integrado en el lenguaje! ¡GRACIAS A TODOS!
Landon Kuhn
3
@ landon9720, de alguna manera lo es: Scalar :: Util tiene recorte, y es básico desde 5.7.3 - ¡Eso es 2002!
Hugmeir
3
Hugmeir, esto está mal, mira la respuesta de Ether .
daxim

Respuestas:

89

Aquí hay un enfoque que usa una expresión regular:

$string =~ s/^\s+|\s+$//g ;     # remove both leading and trailing whitespace

Perl 6 incluirá una función de recorte:

$string .= trim;

Fuente: Wikipedia

Mark Byers
fuente
5
Busco esto una vez al mes. Lástima que no pueda votar a favor cada vez.
kyle
82

Esto está disponible en String :: Util con el trimmétodo:

Nota del editor: String::Utilno es un módulo principal, pero puede instalarlo desde CPAN con [sudo] cpan String::Util.

use String::Util 'trim';
my $str = "  hello  ";
$str = trim($str);
print "string is now: '$str'\n";

huellas dactilares:

la cadena ahora es 'hola'

Sin embargo, es bastante fácil hacerlo usted mismo:

$str =~ s/^\s+//;
$str =~ s/\s+$//;
Éter
fuente
@ mklement0 ni lo será nunca. Pero esto no es relevante, ya que todo el mundo debería usar módulos de CPAN.
Ether
2
¿Por qué todos deberían usar módulos de CPAN? Hace que la coherencia sea difícil cuando se usa perl de su distribución de Linux (debian, redhat, ubuntu) combinado con módulos CPAN instalados manualmente. Es mucho mejor si se puede hacer algo en Perl usando módulos que están disponibles como paquetes en la distribución de Linux
Marki555
Los módulos de @ Marki555 disponibles como paquetes en su distribución de Linux son de CPAN; acaban de ser reempaquetados. Por lo general, puede solicitar que se empaquete un determinado módulo si aún no lo ha hecho (la gente de Debian es particularmente receptiva y útil).
Ether
1
Sé que también son de CPAN ... Sí, generalmente puedo solicitar un nuevo paquete para debian, pero no me ayudará para mi versión estable de Debian instalada ... es por eso que prefiero módulos de paquetes, pero uso directamente CPAN si realmente necesario.
Marki555
4
@Ether Con el debido respeto, realmente agradezco saber que este es un módulo secundario. Esta publicación habla sobre el uso de un módulo en lugar de una expresión regular bastante simple. Si el módulo es básico, estaría mucho más abierto a él. Es relevante en este caso.
UncleCarl
26

No hay una trimfunción incorporada, pero puede implementar fácilmente la suya con una simple sustitución:

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;
}

o usando sustitución no destructiva en Perl 5.14 y posteriores:

sub trim {
   return $_[0] =~ s/^\s+|\s+$//rg;
}
Eugene Yarmash
fuente
3

Para aquellos que están usando Text :: CSV, encontré este hilo y luego noté dentro del módulo CSV que podía eliminarlo a través del interruptor:

$csv = Text::CSV->new({allow_whitespace => 1});

La lógica es al revés en el sentido de que si quieres desnudarte, entonces lo pones en 1. Vaya figura. Espero que esto ayude a alguien.

Douglas
fuente
2

Aplicar: s/^\s*//; s/\s+$//;a él. O utilícelo s/^\s+|\s+$//gsi quiere ser elegante.

Dirk-Willem van Gulik
fuente
2

También utilizo una búsqueda anticipada positiva para recortar los espacios repetidos dentro del texto:

s/^\s+|\s(?=\s)|\s+$//g
Shaun McDonald
fuente
-4

No, pero puede usar el s///operador de sustitución y la \saserción de espacios en blanco para obtener el mismo resultado.

Philip Potter
fuente
Eso eliminaría los espacios entre las palabras, no solo al final de la cadena.
DarenW
@DarenW: depende de cómo lo uses.
Philip Potter