Vous semblez avoir une idée fausse sur la façon dont =~
fonctionne. =~
est un opérateur de liaison qui associe une variable à un opérateur regexp. Il ne fait aucune affectation.
Les opérateurs d'expression rationnelle fonctionnent tous par défaut avec la variable de rubrique $_
, donc s/foo/bar/;
est identique à $_ =~ s/foo/bar/;
. Aucune affectation n'a lieu. La variable de sujet est transformée.
Le cas est analogue lors de l'utilisation de n'importe quelle autre variable. $var =~ s/foo/bar/;
transforme $var
en remplaçant la première instance de foo
par bar
. Aucune affectation n'a lieu.
Le meilleur conseil que je peux vous donner est d'écrire Python en Python et Perl en Perl. Ne vous attendez pas à ce que les deux langues soient identiques.
Vous pourriez faire comme suggère DVK et écrire un sous-programme qui reproduira le comportement de substitution auquel vous êtes habitué.
Ou vous pourriez essayer du Perl idiomatique.Basé sur votre désir exprimé d'appliquer plusieurs transformations dans une ligne, j'ai fourni quelques exemples que vous pourriez trouver utiles.
J'utilise ici une boucle for
sur un élément à thématiser $var
et appliquer de nombreuses transformations codées en dur:
for($var) {
s/foo/bar/;
s/fizz/buzz/;
s/whop/bop-a-loo-bop/;
s/parkay/butter/;
s/cow/burger/;
}
Ou peut-être vous avez besoin d'appliquer un groupe de variables de transformations. Je définis un sous-programme pour faire une boucle sur une liste de références de tableau qui définissent les anciennes/nouvelles paires de transformation. Cet exemple tire parti du traitement des arguments orienté liste de Perl pour gérer n'importe quel nombre de transformations.
my $foo = transform(
'abcd' =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
sub transform {
my $var = shift;
for (@_) {
my ($old, $new) = @$_;
$var =~ s/$old/$new/;
}
return $var;
}
Enfin un peu de vous embêter pour fournir une version de transformation qui modifie son premier argument:
my $foo = 'abcd';
transform_in_place(
$foo =>
[ 'a', 'b' ],
[ 'bb', 'c' ],
[ 'cc', 'd' ],
[ 'dd', 'DONE' ],
);
print "$foo\n";
sub transform_in_place {
for my $i (1..$#_) {
my ($old, $new) = @{$_[$i]};
$_[0] =~ s/$old/$new/;
}
}
Pour mon projet, je serais probablement utiliser l'une des deux premières options en fonction de la besoins du problème particulier.
Votre exemple définir à la fois '$ oldstring 'et' $ newstring' au texte révisé. Vouliez-vous dire de faire la cession avant la substitution et ensuite effectuer une substitution sur «$ newstring»? – mob