Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Avanzado » La sustitución con variables y parámetros no me funciona Responder al tema
Nuevo tema


Página 1 de 1  [ 3 mensajes ] 
 
Nota 2010-02-17 03:48 @200

Perlero Nuevo
Registrado: 2010-02-17 03:39 @194
Mensajes: 2
La sustitución con variables y parámetros no me funciona
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.

Syntax: [ Download ] [ Hide ]
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)


Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
P:\DB\WORK\perl>perl test.pl
var number($1)
var number(10)


Nota 2010-02-17 06:24 @308
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10261
Re: La sustitución con variables y parámetros no me funciona
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:
Syntax: [ Download ] [ Hide ]
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";


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...
Syntax: [ Download ] [ Hide ]
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";

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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$line =~ s/$find/qq(qq($replace))/ee;

La doble ejecución /e equivale al efecto del eval().

_________________
JF^D Perl programming


Nota 2010-02-17 07:00 @333

Perlero Nuevo
Registrado: 2010-02-17 03:39 @194
Mensajes: 2
Re: La sustitución con variables y parámetros no me funciona
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


Responder al tema  [ 3 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO