2012-08-01 15 views
6

Me gustaría insertar el número entre dos patrones:

$s = 'id="" value="div"'; 
$s =~ s/(id=")(".*)/$1123$2/; 

Por supuesto que tengo el error y "value =" div" como consecuencia . el resultado esperado es id = valor "123" = "div".

En la sustitución me refería a $ 1, entonces el número 123 y luego $ 2, pero no $ 1123 y de $ 2. ¿Cuál es el reemplazo correcto en la expresión regular? Me gustaría hacerlo en una sola expresión regular.

Gracias.

Respuesta

16
$s =~ s/(id=")(".*)/$1123$2/; # Use of uninitialized value $1123 in concatenation (.) or string 

A pesar de que se esperaba que para sustituir $1, Perl lo ve como la variable $1123. Perl no tiene forma de saber que te refieres a $1. Así que hay que limitar la variablisation a $1 especificando como ${1}:

$s =~ s/(id=")(".*)/${1}123$2/; 

Siempre es una buena idea incluir lo siguiente en la parte superior de las secuencias de comandos. Le ahorrarán mucho tiempo y esfuerzo.

use strict; 
use warnings; 

Por ejemplo, ejecutar la secuencia de comandos con los módulos anteriores incluyeron los resultados en el mensaje de error:

Use of uninitialized value $1123 in concatenation (.) or string at /tmp/test.pl line 7. 

(no tener en cuenta el nombre del script informado y números de línea.) Se establece claramente lo que espera un intérprete de perl. afirmaciones

Otro abordaje con mirada atrás y-Look-Ahead:

$s =~ s/(?<=id=")(?=")/123/; 
+0

muchas gracias. Busqué sintaxis $ {1}. –

+0

Prefiero la manera detrás y adelante – justintime

+0

@justintime, Bonificación: la versión con las vistas es más rápida porque no tiene capturas. – ikegami

1

Otra variante: Ejemplo

$s =~ s/(id=")(".*)/$1."123".$2/e; 

Uso:

$ cat 1.pl 
$s = 'id="" value="div"'; 
$s =~ s/(id=")(".*)/$1."123".$2/e; 
print $s,"\n"; 

$ perl 1.pl 
id="123" value="div" 
+0

Esta es una variante incorrecta. El resultado será id = "." 1 "." value = "div" –

+0

Agregué un ejemplo de uso. Como puede ver, la variante no está equivocada –

+0

@AlexBroitman probablemente perdió el '/ e' al final. – stevesliva

Cuestiones relacionadas