Parece que tiene una idea falsa sobre cómo funciona =~
. =~
es un operador vinculante que asocia una variable con un operador regexp. No hace ninguna asignación.
Todos los operadores de expresiones regulares funcionan por defecto con la variable de tema $_
, por lo que s/foo/bar/;
es lo mismo que $_ =~ s/foo/bar/;
. No hay asignación. La variable de tema se transforma.
El caso es análogo cuando se opera con cualquier otra variable. $var =~ s/foo/bar/;
transforma $var
reemplazando la primera instancia de foo
con bar
. No hay asignación.
El mejor consejo que puedo darte es escribir Python en Python y Perl en Perl. No espere que los dos idiomas sean iguales.
Puede hacer como DVK sugiere y escribe una subrutina que reproducirá el comportamiento de sustitución al que está acostumbrado.
O podría intentar un Perl idiomático.En función de su deseo expreso de aplicar transformaciones múltiples en una línea, he proporcionado algunos ejemplos que pueden serle útiles.
Aquí, he utilizado un bucle for
más de un elemento a tematizar $var
y aplicar muchas transformaciones no modificables:
for($var) {
s/foo/bar/;
s/fizz/buzz/;
s/whop/bop-a-loo-bop/;
s/parkay/butter/;
s/cow/burger/;
}
O tal vez es necesario aplicar un grupo de variables de transformaciones. Defino una subrutina para recorrer una lista de referencias de matriz que definen pares de transformación antiguos/nuevos. Este ejemplo aprovecha el procesamiento de argumentos orientado a listas de Perl para manejar cualquier cantidad de transformaciones.
my $foo = transform(
'abcd' =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
sub transform {
my $var = shift;
for (@_) {
my ($old, $new) = @$_;
$var =~ s/$old/$new/;
}
return $var;
}
Por último, un poco de perder el tiempo para proporcionar una versión de transformar que modifica su primer argumento:
my $foo = 'abcd';
transform_in_place(
$foo =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
print "$foo\n";
sub transform_in_place {
for my $i (1..$#_) {
my ($old, $new) = @{$_[$i]};
$_[0] =~ s/$old/$new/;
}
}
Por mi propio proyecto que probablemente haría uso de una de las dos primeras opciones en función de la necesidades del problema particular.
Su ejemplo establecer tanto '$ oldstring 'y' $ newstring' al texto revisado. ¿Quería hacer la tarea antes de la sustitución y luego realizar la sustitución en '$ newstring'? – mob