• Publicidad

La sustitución con variables y parámetros no me funciona

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

La sustitución con variables y parámetros no me funciona

Notapor J0an_Perl » 2010-02-17 03:48 @200

Hola, comunidad, éste es un trozo de código muy simplificado.
Necesito reemplazar un texto por otro pero con expresiones regulares
que cogeré de un fichero.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# línea a traducir
$line = 'var varchar2(10)';

# respuesta esperada: var number(10)

# reemplazo con variable, no OK
$find = 'varchar2\((.+)\)';
$replace = 'number($1)';

$line =~ s/$find/$replace/;
print $line."\n";
# RESPUESTA ERR: var number($1)


# reemplazo sin variable, es OK
$line2 = 'var varchar2(10)';
$line2 =~ s/varchar2\((.+)\)/number($1)/;
print $line2."\n";
# RESPUESTA OK: var number(10)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
P:\DB\WORK\perl>perl test.pl
var number($1)
var number(10)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
J0an_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-02-17 03:39 @194

Publicidad

Re: La sustitución con variables y parámetros no me funciona

Notapor explorer » 2010-02-17 06:24 @308

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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.001 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...
Sintáxis: [ Descargar ] [ Ocultar ]
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:
Sintáxis: [ Descargar ] [ Ocultar ]
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().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: La sustitución con variables y parámetros no me funciona

Notapor J0an_Perl » 2010-02-17 07:00 @333

Muchas gracias, explorer,

La verdad es que es mi primer perl, pero de expresiones regulares y programación sí entiendo.

Muchas gracias por tu rápida respuesta y además, muy clara.

Un saludo,
JOAN
J0an_Perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2010-02-17 03:39 @194


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron