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!
@ 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:
eq
.s/^\s+|\s+$//g;
vss/^\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!)Respuestas:
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:
Fuente: Wikipedia
fuente
Esto está disponible en String :: Util con el
trim
método:Nota del editor:
String::Util
no 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:
Sin embargo, es bastante fácil hacerlo usted mismo:
$str =~ s/^\s+//; $str =~ s/\s+$//;
fuente
No hay una
trim
funció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; }
fuente
De acuerdo con el hilo de este perlmonk :
$string =~ s/^\s+|\s+$//g;
fuente
Complete cómo en el perfaq aquí: http://learn.perl.org/faq/perlfaq4.html#How-do-I-strip-blank-space-from-the-beginning-end-of-a-string-
fuente
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.
fuente
Una opción es Text :: Trim :
use Text::Trim; print trim(" example ");
fuente
Aplicar:
s/^\s*//; s/\s+$//;
a él. O utilícelos/^\s+|\s+$//g
si quiere ser elegante.fuente
También utilizo una búsqueda anticipada positiva para recortar los espacios repetidos dentro del texto:
s/^\s+|\s(?=\s)|\s+$//g
fuente
No, pero puede usar el
s///
operador de sustitución y la\s
aserción de espacios en blanco para obtener el mismo resultado.fuente