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
/r
para hacer una sustitución no destructiva:fuente
g
en 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ónmap
en 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 donotnewword
foo
ybar
su 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.