web-dev-qa-db-ja.com

Perl正規表現(Perl演算子文字を含む検索文字列として変数を使用)

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

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

上記のコードを守ってください。何らかの理由で、$ text_to_search変数でテキスト「[foo]」を見つけ、見つかったら「wee」を出力したいと思います。これを行うには、Perlが演算子ではなく文字として扱うように、[and]を[and]に置き換える必要があります。

[式を使用して、最初に]\[\]s///に置き換えることなくこれを行うにはどうすればよいですか?

52
Stefan

つかいます \Q変数内の潜在的に問題のある文字を自動エスケープします。

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

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

Perlがバージョン5.16以降の場合はquotemeta (\Q \E)を使用できますが、以下の場合は正規表現の使用をまったく避けることができます。

たとえば、indexコマンドを使用して:

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