tester - Modificador de Perl Regex ''e''(eval) con s///
regex tutorial (3)
No es exactamente una pregunta "simple", así que no te rindas.
El problema es que con una única /e
, se entiende que RHS es un código cuyo resultado de eval
se usa para el reemplazo.
¿Qué es eso RHS? Es $1
. Si evaluó $1
, encontrará que contiene la cadena $var
. No contiene el contenido de dicha variable, solo $
seguido de una v
seguida de una a
seguida de una r
.
Por lo tanto, debe evaluarlo dos veces, una para convertir $1
en $var
, luego otra vez para convertir el resultado anterior de $var
en la cadena "testing"
. Lo haces teniendo el modificador ee
doble en el operador s
.
Puede comprobar esto bastante fácilmente ejecutándolo con one /e
versus con dos de ellos. Aquí hay una demostración de ambos, más una tercera vía que usa eliminación de referencias simbólica, que, debido a que hace referencia a la tabla de símbolos del paquete, solo funciona en variables de paquete.
use v5.10;
our $str = q(In this string we are $var the "e" modifier.);
our $var = q(testing);
V1: {
local $_ = $str;
s/(/$/w+)/$1/e;
say "version 1: ", $_;
}
V2: {
local $_ = $str;
s/(/$/w+)/$1/ee;
say "version 2: ", $_;
}
V3: {
no strict "refs";
local $_ = $str;
s//$(/w+)/$$1/e;
say "version 3: ", $_;
}
Cuando se ejecuta, eso produce:
version 1: In this string we are $var the "e" modifier.
version 2: In this string we are testing the "e" modifier.
version 3: In this string we are testing the "e" modifier.
Tengo problemas para comprender este uso simple del modificador / e regex.
my $var = ''testing'';
$_ = ''In this string we are $var the "e" modifier.'';
s/(/$/w+)/$1/ee;
print;
Devuelve: "En esta cadena estamos probando el modificador" e ".
No puedo ver por qué se requieren dos modificadores ''e''. Por lo que puedo ver, $ 1 debe capturar ''$ var'' de la cadena y un modificador ''e'' debería poder reemplazar la variable con su valor. Sin embargo, debo estar malinterpretando algo, ya que probar el código anterior con solo un modificador ''e'' no reemplaza visiblemente nada en la cadena.
Disculpe por hacer una pregunta tan simple!
Gracias.
Para que quede claro, el formulario s//ee
no modifica en modo alguno el patrón de expresiones regulares ni la interpretación de expresiones regulares. Es un tratamiento opcional de la cadena lateral de reemplazo después de realizar la expresión regular. (Consulte los operadores PERLOP Regex Quote-like )
El ee
simplemente se mezclan en las opciones de expresión regex del lado del PATRÓN en la forma s/PATTERN/REPLACEMENT/msixpodualgcer
.
De Perlop:
Las opciones son como m // con la adición de las siguientes opciones específicas de reemplazo:
e Evaluate the right side as an expression. ee Evaluate the right side as a string then eval the result. r Return substitution and leave the original string untouched.
Puede ver el mismo comportamiento de tipo e
vs ee
en situaciones no regex, como muestra este ejemplo:
#!/usr/bin/perl
use warnings;
use strict;
my $var = "var''s contents";
my $str=''"-> $var <-"'';
print eval(''$str''), "/n"; # equivalent to s//e
print eval(eval(''$str'')), "/n"; # equivalent to s//ee
Salida:
"-> $var <-"
-> var''s contents <-
Pruebe la utilidad de cambio de nombre del último paquete de Perl con:
rename -v ''s//b(/w)/uc($1)/eg'' *
Aquí, el patrón /b
encuentra el límite de la palabra, y el modificador e
habilita la evaluación en la sustitución, g
reemplaza la ocurrencia total.
También puede cambiar el nombre a camelCase con:
rename -v ''s//b(/w)/uc($1)/eg'' *
rename -v ''s/^(/w)/lc($1)/e'' *
rename -v ''s//s+//g'' *