web-dev-qa-db-fra.com

Expression régulière Perl (utilisation d'une variable en tant que chaîne de recherche avec des caractères d'opérateur Perl inclus)

$text_to_search = "example text with [foo] and more";
$search_string = "[foo]";

if ($text_to_search =~ m/$search_string/)
    print "wee";

Veuillez respecter le code ci-dessus. Pour une raison quelconque, j'aimerais trouver le texte "[foo]" dans la variable $ text_to_search et imprimer "wee" si je le trouve. Pour ce faire, je devrais m'assurer que [et] est remplacé par [et] pour que Perl le traite comme des caractères plutôt que comme des opérateurs.

Comment puis-je faire cela sans avoir à remplacer au préalable [ et ] avec \[ et \] utilisant un s/// expression?

52
Stefan

Utilisation \Q pour créer automatiquement un caractère potentiellement problématique dans votre variable.

if($text_to_search =~ m/\Q$search_string/) print "wee";
61
Dave Cross

Utilisez la fonction quotemeta :

$text_to_search = "example text with [foo] and more";
$search_string = quotemeta "[foo]";

print "wee" if ($text_to_search =~ /$search_string/);
46
Platinum Azure

Vous pouvez utiliser quotemeta (\Q \E) si votre version de Perl est la version 5.16 ou ultérieure, mais si vous utilisez une configuration inférieure à celle-ci, vous pouvez simplement éviter d'utiliser une expression régulière.

Par exemple, en utilisant la commande index:

if (index($text_to_search, $search_string) > -1) {
    print "wee";
}
18
Boris Ivanov