WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perl で文字列を照合する if 文の問題

0:[投稿] 彪子 [2007/01/15 10:31 ] [環境:IE6,WIN98 UNIX]

旧年中は大変お世話になりました。今年もどうかよろしくお願いいたします。

perl で、テキストの中に、ある文字列が含まれているかどうかを聞く if 文がエラーになります。

(1) if ($_ =~ m/URL/i)

だとうまくいくのに

(2) if ($_ =~ m/バナーのURL/i)

または

(3) if ($_ =~ m/バナーのURL/)

に変えるとエラーになります。試しに

(4) if ($_ eq "バナーのURL")

にするとエラーはなくなりました。
以上から、私には (2)、(3) の記述そのものに問題があるように見えます。
どういった原因が考えられるでしょうか。


1:[回答] Iwa [2007/01/15 15:52 ][URL]

「URL」と「バナーのURL」の違いは何でしょうか?

よくある間違いとしては、パターンマッチでm/〜/としているわけですから〜の部分に/があってはいけないことになります。
ほかにも正規表現として意味を持つ文字(.等)がありますからそれらをエスケープ(特別な意味のある文字ではなくただの文字として扱わせるための処理)しないといけなくなります。
ですので、m/\QバナーのURL\E/i としてみてください。

\Qと\Eで囲まれた部分はエスケープされます。(\Qや\Eも特別な意味のある文字ということになります)
また、quotemetaを使用して、
$hoge = quotemeta('バナーのURL');
if($_ =~ m/$hoge/i){ 〜 }
ともできます。

ちなみに、$_ は省略すことができるので
if(m/\QバナーのURL\E/)
とも書けます。
また、パターンマッチで/を使う場合はmも省略できますので
if(/\QバナーのURL\E/)
でもOKです。

(4)は正規表現ではなくただの比較演算子を用いての処理ですから(全て文字列として扱われるので)エラーは起きません。


2:[回答] regexp [2007/01/15 22:27 ]

試しに
if ($_ =~ m/バナ..のURL/i)
ならどうでしょう?

これがエラーにならないなら、スクリプトの文字コードが Shift-JISだからだと思います。

Shift-JISの "ー" は正規表現では特殊な意味を持つ [ のコード(5B)を含みます。
スクリプト全体を EUCにするか、少なくとも検索文字列 "バナーのURL" と被検索文字列 $_ を EUCにしてみては。


3:[回答] Iwa [2007/01/16 00:23 ]

あれ?
「バナーのURL」はてっきりなんらかのURL(http://〜)のことを指しているのかと思いましたがパターンそのものでしたか。(ぉ
となると2でregexpさんが書いていらっしゃる通り文字コードの問題ですね。


5:[完了] 彪子 [2007/01/18 14:04 ]

Iwa さん、regexp さん、ありがとうございます。
Iwa さんのおっしゃるとおり、

m/\QバナーのURL\E/i

としたところ、エラーがなくなりました。
また、regexp さんのおっしゃるように、

if ($_ =~ m/バナ..のURL/i)

としてもエラーがなくなりました。
おふたりから教えていただいたことはだいたい理解できたつもりですが、文字コードについては知識がないためわかりませんでした。おふたりの回答はコピーして保存させていただき、勉強したいと思います。
ありがとうございました。どうか今後ともよろしくお願いたします。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]