2011-01-08 19 views
6

¿Es posible reemplazar partes de una cuerda sin tener que crear una variable completamente nueva?Cadena Perl - Caracteres Sustituidos sin formar una nueva variable

Ahora mismo lo hago de esta manera:

$someString = "how do you do this"; 
$someString = s/how do/this is how/; 

Lo que estoy tratando de hacer es mantener la cadena original ($ someString) y ser capaz de sustituir unos personajes sin modificar la cadena original. Estoy más familiarizado con Javascript y puedo hacerlo así en tu código sin tener que crear/modificar una variable.

someString.replace(/how do/, "this is how") 

Cualquier ayuda se agradece, gracias mucho

+1

posible duplicado de [Perl: Utilice s/(reemplazar) y devolver una nueva cadena] (http://stackoverflow.com/questions/3440363/perl-use-s-replace-and-return-new-string) – daxim

Respuesta

11

Nota bastante seguro de entender la pregunta. Si desea dejar sin cambios la cadena original, debe crear una nueva variable.

$newstring = $someString ; 
$newstring =~ s/how do/this is how/; 

Tenga en cuenta que el operador es =~ no =

Además creo que ahora veo lo que quiere - para devolver la cadena cambiada en lugar de modificar una variable. Habrá una manera de hacer esto en Perl 5.14, pero no estoy al tanto de la forma en el presente. Consulte Use the /r substitution flag to work on a copy en The Effective Perler.

actualización El s///r funcionabilidad ha sido lanzado en Perl desde hace algún tiempo. que puede hacer

use 5.14.0 ; 
my $someString = "how do you do this"; 
say ($someString =~ s/how do/this is how/r) ; 
+0

Creo que podría querer algo como 'print $ someString = ~ s/how do/this is how /; 'pero sin tocar' $ someString'. – marcog

+0

Buen trabajo al mencionar la nueva bandera/r, creo que va a ser una adición aún mejor a Perl5 que la coincidencia inteligente ~~ –

+0

Sí, solo estaba buscando devolver la cadena modificada en lugar de modificar una variable. Es bueno ver que esto será capaz pronto. –

0

También puede utilizar lambda, es decir:

sub { local $_ = shift; s/how do/this is how/; $_ }->($someString) 

Esto también preserva $_ en caso de que se llama a la lambda como sub { }->($_)

Cuestiones relacionadas