En Perl, quel est le 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 changer l'original?
Habituellement, je copie simplement la chaîne dans une nouvelle variable, puis la lie à l' s///
expression régulière qui effectue le remplacement sur la nouvelle chaîne, mais je me demandais s'il existe une meilleure façon de le faire?
$newstring = $oldstring;
$newstring =~ s/foo/bar/g;
my $new = $_ for $old =~ s/foo/bar;
fonctionnerait?s/foo/bar/ for my $newstring = $oldstring;
cela fonctionne, mais c'est beaucoup plus étrange.La déclaration:
Ce qui équivaut à:
Alternativement, à partir de Perl 5.13.2, vous pouvez utiliser
/r
pour faire une substitution non destructive:la source
g
dans votre regex top?Sous
use strict
, dites:au lieu.
la source
La solution à une seule ligne est plus utile comme shibboleth que comme bon code; les bons codeurs Perl le sauront et le comprendront, mais c'est beaucoup moins transparent et lisible que le couplet de copie et de modification à deux lignes avec lequel vous commencez.
En d'autres termes, une bonne façon de faire est la façon dont vous le faites déjà . Une concision inutile au détriment de la lisibilité n'est pas une victoire.
la source
Une autre solution pré-5.14: http://www.perlmonks.org/?node_id=346719 (voir l'article de japhy)
Comme son approche l'utilise
map
, cela fonctionne également bien pour les tableaux, mais nécessite une cascademap
pour produire un tableau temporaire (sinon l'original serait modifié):la source
Je déteste foo et bar .. qui a imaginé ces termes non descriptifs dans la programmation de toute façon?
la source
=~ s
.)newword donotnewword newword donotnewword newword donotnewword
foo
etbar
, sa réponse aurait été exacte. Prouver, une fois de plus, que les coutumes existent pour une raison et que les leçons ne sont apprises qu'à la dure. ;)Si vous écrivez Perl avec
use strict;
, vous constaterez que la syntaxe d'une ligne n'est pas valide, même lorsqu'elle est déclarée.Avec:
Vous obtenez:
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
use strict;
. Pour moi, utiliseruse strict;
n'est plus qu'une habitude maintenant. Je le fais automatiquement. Tout le monde devrait.la source
use warnings;
au lieu de-w
, vous obtenez un meilleur contrôle: par exemple, si vous souhaitez désactiver temporairement les avertissements dans un bloc de code.