2011-06-08 14 views
9

que desea hacer coincidir y asignar a una variable en una sola línea:¿Cómo asigno el resultado de una coincidencia de expresiones regulares a una nueva variable en una sola línea?

my $abspath='/var/ftp/path/to/file.txt'; 

$abspath =~ #/var/ftp/(.*)$#; 
my $relpath=$1; 

Estoy seguro de que debe ser fácil.

+0

* 'sólo una line' * - Es Hay una razón especial para eso? Usted sabe que las frases sinceras no son la mejor opción cuando se capturan patrones que no admiten nulos. – Wolf

Respuesta

17
my ($relpath) = $abspath =~ m#/var/ftp/(.*)$#; 

En el contexto de lista del partido devuelve los valores de los grupos.

8

que se puede lograr con el partido y reemplazar operador:

(my $relpath = $abspath) =~ s#/var/ftp/(.*)#$1# ; 

Este código asigna a $abspath$relpath y luego se aplica la expresión regular en él.

Editar: Qtax la respuesta es más elegante si solo necesitas coincidencias simples. Si alguna vez necesitas sustituciones complejas (como suelo necesitar), utiliza mi expresión.

5

Con Perl 5.14 también se puede utilizar el /r (sustitución no destructiva) modificador:

perl -E'my $abspath="/var/ftp/path/to/file.txt"; \ 
     my $relpath= $abspath=~ s{/var/ftp/}{}r; \ 
     say "abspath: $abspath - relpath: $relpath"' 

Ver "New Features of Perl 5.14: Non-destructive Substitution" para más ejemplos.

15

obligatorio Clippy: "! Hola veo que está haciendo la manipulación ruta en Perl ¿Quieres usar Path::Class lugar.?"

use Path::Class qw(file); 
my $abspath = file '/var/ftp/path/to/file.txt'; 
my $relpath = $abspath->relative('/var/ftp'); 
# returns "path/to/file.txt" in string context 
+0

y es por eso que sigo SO, siempre me olvido de Path :: Class. Gracias – mirod

-1

Como lo que desea es eliminar el principio de la cadena se podría optimizar la expresión:

(my $relpath = $abspath) =~ s#^/var/ftp/##; 

O incluso:

my $relpath = substr($abspath, 9); 
Cuestiones relacionadas