2010-09-06 9 views
37

Quiero poder hacer una coincidencia de expresiones regulares en una variable y asignar los resultados a la variable en sí. ¿Cuál es la mejor manera de hacerlo?Coincidir con la expresión regular y asignar resultados en una sola línea de código

quiero combinar esencialmente las líneas 2 y 3 en una sola línea de código:

$variable = "some string"; 
$variable =~ /(find something).*/; 
$variable = $1; 

¿Hay un camino más corto/más simple de hacer esto? ¿Me estoy perdiendo de algo?

Respuesta

24

¿Por qué quieres que sea más corto? ¿Realmente es materia?

$variable = $1 if $variable =~ /(find something).*/; 

Si usted está preocupado por el nombre de variable o de hacer esto en varias ocasiones, envolver la cosa en una subrutina y olvidarse de él:

some_sub($variable, qr/pattern/); 
sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 }; 

Sin embargo ponerlo en práctica, el punto de la subrutina es haz que sea reutilizable, por lo que le das a un conjunto particular de líneas un nombre corto que se encuentra en su lugar.

7

Se puede hacer la sustitución como:

$a = 'stackoverflow'; 
$a =~ s/(\w+)overflow/$1/; 

$a es ahora "stack"

+0

Existe un problema con esto, solo reemplazará la variable original si toda la cadena está presente en el patrón de búsqueda. Si tuviera que usar, digamos,/(\ w +) sobre/para hacer coincidir, esto no funcionaría. –

+0

El patrón es arbitrario, las coincidencias no necesariamente comienzan o terminan en un límite de línea o palabra. En cualquier caso, gracias, supongo que no hay ninguna manera obviamente simple de hacerlo. Mi principal preocupación es que tengo que hacer esto a menudo, y parece repetitivo. –

+0

Tropezamos con este hilo de 2 años a través de Google, y creo que esta es la respuesta correcta. Simplemente edite la expresión regular para que se ajuste a sus necesidades: /.*(find something). */$ 1 /; – Mintx

4

Casi ....

Puede combinar el partido y recuperar el valor emparejado con una sustitución.

$variable =~ s/.*(find something).*/$1/; 

yo sepa, siempre se tendrá que copiar el valor, sin embargo, a menos que no se preocupa de darle una paliza a la original.

6

Bueno, se podría decir

my $variable; 
($variable) = ($variable = "find something soon") =~ /(find something).*/; 

o

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/; 
+0

Prefiero usar la definición de variable por separado para mayor claridad, pero sí, esta es una buena solución para búsquedas rápidas. Gracias. –

3

hago esto:

#!/usr/bin/perl 

$target = "n: 123"; 
my ($target) = $target =~ /n:\s*(\d+)/g; 
print $target; # the var $target now is "123" 
52
my($variable) = "some string" =~ /(e\s*str)/; 

Esto funciona porque

Si no se utiliza la opción /g, m// en contexto lista Devuelve una lista que consiste en las subexpresiones emparejados por los paréntesis en el patrón, es decir , ($1, $2, $3 ...).

y porque my($variable) = ... (tenga en cuenta los paréntesis alrededor del escalar) proporciona el contexto de la lista para la coincidencia.

Si el patrón no coincide, $variable obtiene el valor indefinido.

+0

Para agregar a la descripción al contexto de la lista. El OoO es equivalente a 'my ($ foo) = (" barbox "= ~/(soap | box) /);' – vol7ron

+0

También agregaré otro ejemplo. Si desea anteponer una cadena a los resultados en la misma llamada: 'mi ($ foo) = mapa (" prefijo _ $ _ ", @ {[" barra de cuadro "= ~/(soap | box) /)]}) ; '. En este caso, terminarías con "prefix_box". – vol7ron

+2

¡Esta debería ser la respuesta aceptada! – mrfred

4
$variable2 = "stackoverflow"; 
(my $variable1) = ($variable2 =~ /stack(\w+)/); 

$variable1 ahora es igual a "overflow".

Cuestiones relacionadas