Bienvenido a los foros de Perl en Español, J0an_Perl.
El asunto es algo complejo, ya que se trata de interpretar código Perl, y dentro de una expresión regular. Es decir, hay que hacer una doble interpolación.
Esta es la solución:
Using perl Syntax Highlighting
my $line = 'var varchar2(10)';
my $find = 'varchar2\((.+)\)';
my $replace = 'number($1)';
$line =~ s/$find/eval(qq(qq($replace)))/e;
print "[$1][$line]\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Esto es lo que ocurre:
* En la expresión regular se ha añadido la opción
/e, para indicar que la segunda parte de la sustitución debe ser ejecutada, y no una sustitución literal
* La ejecución consiste en la evaluación (
eval()) de una cadena de caracteres, que está entrecomillada con dobles comillas, dos veces, una dentro de otra.
* El resultado es, primero, tener una cadena de caracteres que es exactamente
"number($1)". Y eso es lo que le pasamos al eval(), que realiza la segunda interpolación gracias al entrecomillado.
Desde luego, quedaría más claro, haciéndolo en más líneas...
Using perl Syntax Highlighting
my $line = 'var varchar2(10)';
my $find = qr/varchar2\((.+)\)/; # expresión regular
my $replace = 'number($1)'; # cadena de sustitución
$line =~ $find; # buscamos
$line = eval(qq(qq($replace))); # evaluamos
print "[$line]\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Así no hay sustitución, si no que solo realizamos la búsqueda de patrones, para luego ser evaluadas en la cadena $replace.
Actualización: Otra forma de hacerlo es:
Using perl Syntax Highlighting
$line =~ s/$find/qq(qq($replace))/ee;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La doble ejecución
/e equivale al efecto del
eval().