• ベストアンサー

perlにおける正規表現で、パターンに変数を使う場合について教えてください。

変数と変数を正規表現にて比較する場合に、 if ($text =~ /$pattern/) { ... } とすると、「$pattern」を変数として認識しません。 「$」が位置指定子として認識されている?ようです。 「$pattern」を変数として認識させるにはどのようにすればよいのでしょうか? 「\$pattern」のように「\(バックスラッシュ)」を入れても認識されませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

裏技っぽいんですが, if ($text =~ $pattern) { ... } でよかったりして. あとで見たときに困りそうですが.

DynamisH
質問者

お礼

回答ありがとうございます。 もう疲れ果てて家に帰ってきてしまいました(笑) 明日出勤したら早速ためしてみます!

DynamisH
質問者

補足

お礼と補足が逆になってしまいましたが、 if ($text =~ $pattern) { ... }でいけました! 本当にありがとうございます! 補足としては$patternがファイルから読み込んだ文字列であり、 改行コードが含まれていたため比較してもひっかからなかったというのもありました。 ($patternに文字列を入れた後、改行コードを削除したら大丈夫でした。)

その他の回答 (1)

回答No.1

>「$pattern」を変数として認識させるにはどのようにすればよいのでしょうか? if ($text =~ /$pattern/) { ... } で大丈夫ですよ。 ただし、$pattern に「\」などの記号を入れる場合は、注意が必要です。例えば、 if ($text =~ /\s+/) { ... } としたい場合は、 $pattern = "\\s+"; # \が2つ必要 if ($text =~ /$pattern/) { ... } としなければなりません。 上の問題ではないときは、うまくいかない$textと$patternの情報を提示いただければ、何かわかるかもしれません。

DynamisH
質問者

お礼

回答ありがとうございます。 すみません。もう自宅に帰ってきてしまったので、 詳細の情報はすぐには書けませんが、 あるテキストファイルから1行ずつ読み込み、 $patternに格納した後、それが$text内に含まれるかをチェックしようとしています。 ($patternに格納するものには「\」などのエスケープが必要な文字はありません) EOFまで読み込むため、ループにて制御し、 変数による比較を行わなければならないのですが、 変数を使う>$を頭につける>認識しない!という感じだと思っているのですが、他に理由などあるのでしょうか。 少ない情報で申し訳ありません。

DynamisH
質問者

補足

回答ありがとうございます。 上下いれかわってますが・・・ $patternがファイルから読み込んだ文字列であり、 改行コードが含まれていたため比較してもひっかからなかったようです。 さらにTacosanの //を使わない業を使用したら$patternが文字列として認識されました。

関連するQ&A