web-dev-qa-db-fra.com

Perl: utilisez s / (replace) et retournez une nouvelle chaîne

En Perl, l'opérateur s/ est utilisé pour remplacer des parties d'une chaîne. Maintenant s/ modifiera son paramètre (la chaîne) en place. Je voudrais cependant remplacer des parties d'une chaîne avant de l'imprimer, comme dans

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

Existe-t-il une telle fonction replace en Perl, ou une autre manière de le faire? s/ ne fonctionnera pas directement dans ce cas, et j'aimerais éviter d'utiliser une variable d'assistance. Existe-t-il un moyen de le faire en ligne?

28
sleske

Non testé:

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

Voir Perl5132delta :

L'opérateur de substitution prend désormais en charge une option/r qui copie la variable d'entrée, effectue la substitution sur la copie et renvoie le résultat. L'original reste inchangé.

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

Si vous avez Perl 5.14 ou supérieur, vous pouvez utiliser l'option /r Avec l'opérateur de substitution pour effectuer substitution non destructive :

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

Dans les versions antérieures, vous pouvez obtenir le même résultat en utilisant un bloc do() avec une variable lexicale temporaire, par exemple:

print "bla: ", do { (my $tmp = $myvar) =~ s/a/b/; $tmp }, "\n";
4
Eugene Yarmash
print "bla: ", $myvar =~ tr{a}{b},"\n";
2
Ali Mohammadi
print "bla: ", $_, "\n" if ($_ = $myvar) =~ s/a/b/g or 1;
1
unbeli

Si vous voulez vraiment, vous pouvez créer le vôtre, mais je ne le ferais pas parce que vous avez beaucoup plus de fonctionnalités avec s/// ... vous pouvez intégrer cette fonctionnalité à votre fonction, mais pourquoi recréer quelque chose qui existe déjà?

#!/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;
   }
0
vol7ron