2010-03-20 13 views

Respuesta

8

Si está seguro de que hay es uno/al final todo el tiempo que puede utilizar la función chuleta:

$test = "test/"; 
$test = chop($test); 

Si no está seguro de que puede hacer:

$test = "test/"; 
$test = $1 if($test=~/(.*)\/$/); 
+0

felicitaciones por la reputación 10k – Zerobu

+0

@Zerobu: Gracias amigo :) – codaddict

+0

Uso inútil del grupo de captura, y si la cadena contiene nuevas líneas, también se romperá. – Qtax

12

Con una expresión regular hacer: $test =~ s/\/$//

Alternativamente, si estás segura el último carácter va a ser una barra, puede utilizar la función chop: chop $test

+3

Escribiría '$ test = ~ s [/ $] []' para la legibilidad. – Quentin

+1

Usa el anclaje \ z para obtener el final absoluto de la cadena. –

+1

Perdón por molestar, pero parece que esta expresión regular funciona para todos los directorios, * excepto * cuando se usa 'directorio raíz' * ->/<-.Simplemente eliminará la ruta raíz, que en algunos casos no es tan buena, porque comenzará con una barra inclinada final (¿paradoja?). ;-) – Semo

8

Usted puede utilizar el operador s/// substitución:

$test =~ s{/\z}{}; 
+1

Las mentes geniales piensan igual ... – justintime

+1

Use el anclaje \ z para obtener el final absoluto de la cadena. –

8

Personalmente me gustaría reformular esto para evitar la mezcla de "\" y "/"

$test =~ s|/$|| 

Si utiliza "|" que no es necesario citar el "/"

+1

Usa el anclaje \ z para obtener el final absoluto de la cadena. –

0

Este fragmento se hará cargo de barras al final, excepto en el directorio raíz:

#!/usr/bin/perl 
 

 
my $test = './'; 
 
$test =~ s{(.+)/\z}{\1}; 
 
print $test."\n";

Aquí es cómo funciona:

La primera parte de la expresión regular - s {(. +)/\ Z} - define un grupo entre corchetes (). Esto se referencia en el \ 1 en la segunda parte de la expresión regular - {\ 1}. Dentro de este grupo, definí uno o más caracteres - . + - seguido inmediatamente por una barra inclinada, seguida por el final absoluto de la cadena - \ z.

La expresión regular guarda todo dentro de los corchetes, para ser utilizado más tarde como \ 1 en la especificación de reemplazo

Esto funciona muy similar a una estrategia típica de sed, a saber (la segunda parte, en el fondo.):

echo "./" | sed -e 's:\(..*\)/$:\1:'

espero que esto sea de ayuda para usted.

+0

Es bueno ver uno que aborde el problema del mundo real del directorio raíz. Dos ideas adicionales: 1) Creo que la forma recomendada de sustituir capturas en el reemplazo es con "$" en lugar de "\", aunque ambos funcionan. 2) Puede ser más eficiente simplemente capturar el carácter justo antes del final /, en lugar de potencialmente muchísimos caracteres. Incorporando ambos cambios, lo haría: 's {(.)/\ Z} {$ 1}' –

Cuestiones relacionadas