De la réponse de perlfaq6 à How do I match a regular expression that's in a variable?:
Nous n'avons pas à des modèles difficiles codes dans l'opérateur de correspondance (ou toute autre chose qui fonctionne avec des expressions régulières). Nous pouvons mettre le motif dans une variable pour une utilisation ultérieure. L'opérateur match est un contexte de double guillemets, de sorte que vous pouvez interpoler votre variable comme une chaîne entre guillemets. Dans ce cas, vous lisez l'expression régulière en tant qu'entrée utilisateur et la stockez dans $ regex. Une fois que vous avez le motif dans $ regex, vous utilisez cette variable dans l'opérateur match.
chomp(my $regex = <STDIN>);
if($string =~ m/$regex/) { ... }
Toute expression régulière des caractères spéciaux $ regex sont toujours spéciales, et le modèle doit encore être valide ou Perl se plaindra. Par exemple, dans ce modèle, il y a une parenthèse non appariée.
my $regex = "Unmatched (paren";
"Two parens to bind them all" =~ m/$regex/;
Lorsque Perl compile l'expression régulière, il traite la parenthèse comme le début d'un match de mémoire.Quand il ne trouve pas la parenthèse fermante, il se plaint:
Unmatched (in regex; marked by <-- HERE in m/Unmatched (<-- HERE paren/ at script line 3.
Vous pouvez contourner ce de plusieurs façons en fonction de notre situation. Tout d'abord, si vous ne voulez pas que les caractères de la chaîne soient spéciaux, vous pouvez leur échapper avec quotemeta avant d'utiliser la chaîne. Vous pouvez également le faire directement dans l'opérateur match en utilisant les séquences \ Q et \ E. Le \ Q indique à Perl où commencer à échapper des caractères spéciaux, et le \ E lui indique où s'arrêter (voir perlop pour plus de détails).
chomp(my $regex = <STDIN>);
if($string =~ m/\Q$regex\E/) { ... }
Alternativement, vous pouvez utiliser // qr, l'opérateur de citation d'expression régulière (voir perlop pour plus de détails). Il cite et compile peut-être le motif, et vous pouvez appliquer des drapeaux d'expression régulière au motif.
chomp(my $input = <STDIN>);
my $regex = qr/$input/is;
$string =~ m/$regex/ # same as m/$input/is;
Vous pourriez également vouloir piéger des erreurs en enveloppant un bloc eval autour de l'ensemble.
chomp(my $input = <STDIN>);
eval {
if($string =~ m/\Q$input\E/) { ... }
};
warn [email protected] if [email protected];
Ou ...
my $regex = eval { qr/$input/is };
if(defined $regex) {
$string =~ m/$regex/;
}
else {
warn [email protected];
}
Voir http://stackoverflow.com/questions/1949731/how-can-i-escape-a-literal-string-i- want-to-interpolate-into-a-expression-normale –
duplication possible de [Comment gérer les caractères spéciaux dans une regex Perl?] (http://stackoverflow.com/questions/576435/how-do-i-handle -special-characters-in-a-perl-regex) – daxim