2010-08-09 22 views
23

En Perl, el operador s/ se usa para reemplazar partes de una cadena. Ahora s/ alterará su parámetro (la cadena) en su lugar. Sin embargo, quisiera reemplazar partes de una cadena se acaben imprimirlo, como enPerl: Use s/(replace) y return new string

print "bla: ", replace("a","b",$myvar),"\n"; 

¿Existe tal replace función en Perl, o alguna otra forma de hacerlo? s/ no funcionará directamente en este caso, y me gustaría evitar el uso de una variable auxiliar. ¿Hay alguna forma de hacer esto en línea?

+1

posible duplicado de [¿Cómo se realiza un cambio de Perl en una cadena, manteniendo el original?] (Http://stackoverflow.com/questions/22836/how-do-i-perform- a-perl-substitution-on-a-string-while-keeping-the-original) – daxim

Respuesta

49

No comprobado:

require 5.013002; 
print "bla: ", $myvar =~ s/a/b/r, "\n"; 

Ver perl5132delta:

El operador de sustitución ahora es compatible con una opción/r que copia la variable de entrada, lleva a cabo la sustitución en la copia y devuelve el resultado. El original permanece sin modificaciones.

my $old = 'cat'; 
my $new = $old =~ s/cat/dog/r; 
# $old is 'cat' and $new is 'dog' 
+0

wow, nueva opción, agradable – unbeli

+0

¡Bueno, qué sabes! Muy útil. Si lo hubiera sabido, ¡lo habría usado el 80% del tiempo! –

+0

Ah, ahora veo que en realidad es muy reciente ... Perl 5.13.2. Por lo tanto, sigue siendo interesante buscar soluciones para versiones anteriores. –

3

En Perl 5.14 y más tarde se puede utilizar la opción /r con el operador de sustitución para realizar non-destructive substitution:

print "bla: ", $myvar =~ s/a/b/r, "\n"; 

Alternativamente, se puede utilizar un bloque de do() con una variable léxica temporal, por ejemplo:

print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n"; 
+1

Se agregó en [commit 4f4d7508b0c2c114e5f52420e0e87a853c5f642a] (http://perl5.git.perl.org/perl.git/commit/4f4d7508b0c2c114e5f52420e0e87a853c5f642a). – daxim

+0

Interesante, no sabía sobre 'do()'. Para mi propósito, es un poco complicado, sin embargo: - /. – sleske

0
print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1; 
+0

Lo siento, no entiendo. ¿Por qué el "si"? – sleske

+0

@sleske: ¿Qué pasa si '$ myvar' no contiene un' a'. En ese caso, '$ _' no estaría definido. También es la razón por la cual se ha agregado el 'o 1' en esta respuesta, para forzar la 'impresión' a seguir adelante incluso si no hay nada que sustituir. No es terriblemente legible IMO. – Zaid

+0

@Zaid:? $ _ no estaría indefinido; solo se configuró en $ myvar. Esto se hace mejor como '($ _ = $ myvar) = ~ s/a/b/g, imprime" bla: ", $ _," \ n "' – ysth

0

Si realmente desea, puede hacer su propio, pero yo no porque tiene mucha más funcionalidad con s/// ... se podría construir esa funcionalidad en su función, pero ¿por qué recrear algo que ya existe?

#!/usr/bin/perl -w  

use strict;  

    main(); 

    sub main{  
     my $foo = "blahblahblah";   
     print '$foo: ' , replace("lah","ar",$foo) , "\n"; #$foo: barbarbar 

    }   

    sub replace { 
     my ($from,$to,$string) = @_; 
     $string =~s/$from/$to/ig;       #case-insensitive/global (all occurrences) 

     return $string; 
    } 
2
print "bla: ", $myvar =~ tr{a}{b},"\n"; 
Cuestiones relacionadas