En Perl, ¿cuál es una buena manera de realizar un reemplazo en una cadena usando una expresión regular y almacenar el valor en una variable diferente, sin cambiar el original?
Por lo general, solo copie la cadena a una nueva variable y luego la s///asocio a la expresión regular que reemplaza la nueva cadena, pero me preguntaba si hay una mejor manera de hacer esto.
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;

my $new = $_ for $old =~ s/foo/bar;funcionaría.s/foo/bar/ for my $newstring = $oldstring;funciona, pero es mucho más raro.La declaración:
Lo que es equivalente a:
Alternativamente, a partir de Perl 5.13.2 puede usar
/rpara hacer una sustitución no destructiva:fuente
gen tu expresión regular superior?Debajo
use strict, di:en lugar.
fuente
La solución de una línea es más útil como un shibboleth que un buen código; los buenos codificadores de Perl lo sabrán y lo entenderán, pero es mucho menos transparente y legible que el acoplado de dos líneas para copiar y modificar con el que está comenzando.
En otras palabras, una buena manera de hacerlo es la forma en que ya lo estás haciendo. La concisión innecesaria a costa de la legibilidad no es una victoria.
fuente
Otra solución anterior a la 5.14: http://www.perlmonks.org/?node_id=346719 (ver la publicación de japhy)
A medida que utiliza su enfoque
map, también funciona bien para las matrices, pero requiere una conexiónmapen cascada para producir una matriz temporal (de lo contrario, el original se modificaría):fuente
Odio foo y bar ... ¿quién soñó estos términos no descriptivos en la programación de todos modos?
fuente
=~ s.)newword donotnewword newword donotnewword newword donotnewwordfooybarsu respuesta hubiera sido precisa. Demostrando, una vez más, las costumbres existen por una razón y las lecciones solo se aprenden de la manera difícil. ;)Si escribe Perl con
use strict;, encontrará que la sintaxis de una línea no es válida, incluso cuando se declara.Con:
Usted obtiene:
En cambio, la sintaxis que ha estado utilizando, aunque es una línea más larga, es la forma sintácticamente correcta de hacerlo
use strict;. Para mí, usaruse strict;es solo un hábito ahora. Lo hago de forma automática. Todos deberían.fuente
use warnings;lugar de eso-w, obtiene un mayor control: por ejemplo, si desea desactivar temporalmente las advertencias en un bloque de código.