196 votes

Comment puis-je effectuer une substitution de Perl sur une chaîne tout en conservant l’original ?

En Perl, ce qui est un bon moyen d’effectuer un remplacement sur une chaîne à l’aide d’une expression régulière et de stocker la valeur dans une variable différente, sans modifier l’original ?

J’ai habituellement juste copier la chaîne à une nouvelle variable puis liez-le à la `` regex qui effectue le remplacement sur la nouvelle chaîne, mais je me demandais si il y a une meilleure façon de le faire ?

279voto

John Siracusa Points 8106

Il s’agit de l’idiome, que j’ai toujours utilisé pour obtenir une copie modifiée d’une chaîne sans modifier l’original :

En perl 5.14.0 ou ultérieure, vous pouvez utiliser le nouveau `` modificateur de substitution non destructifs :

46voto

Pat Points 18943

L’instruction :

Équivaut à :

À partir de Perl 5.13.2 vous pouvez également utiliser `` pour faire une substitution non destructive :

26voto

Sam Kington Points 901

Sous use strict , dites:

 (my $new = $original) =~ s/foo/bar/;
 

au lieu.

13voto

Josh Millard Points 939

La solution à une ligne est plus utile que le code; les bons codeurs Perl le sauront et le comprendront, mais il est beaucoup moins transparent et lisible que le couplet de copier-modifier à deux lignes par lequel vous commencez.

En d'autres termes, une bonne façon de faire est la façon dont vous le faites déjà . La concision inutile au détriment de la lisibilité n'est pas une victoire.

0voto

Tim Kennedy Points 1385

Si vous écrivez Perl avec use strict; , vous constaterez que la syntaxe à une ligne n'est pas valide, même lorsqu'elle est déclarée.

Avec:

 my ($newstring = $oldstring) =~ s/foo/bar/;
 

Vous obtenez:

 Can't declare scalar assignment in "my" at script.pl line 7, near ") =~"
Execution of script.pl aborted due to compilation errors.
 

Au lieu de cela, la syntaxe que vous avez utilisée, bien qu’une ligne plus longue, est la manière syntaxiquement correcte de le faire avec use strict; . Pour moi, utiliser use strict; n'est qu'une habitude maintenant. Je le fais automatiquement. Tout le monde devrait.

 #!/usr/bin/env perl -wT

use strict;

my $oldstring = "foo one foo two foo three";
my $newstring = $oldstring;
$newstring =~ s/foo/bar/g;

print "$oldstring","\n";
print "$newstring","\n";
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X