プロが教える店舗&オフィスのセキュリティ対策術

検索するチェックボックスの配列データに、全て一致するデータを、
データファイルから取り出すコードで以下のようなエラーメッセージが
出ました。
どこが悪いのかわかりません、教えてください。

コード:
if (@setubi_o){
my $count=0;
for($i=0;$i<$#setubi_o+1;$i++){
if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;}
}
if($count==$#setubi+1){;}else{next;}
}
エラーメッセージ(KCatch.pm)
[estate.cgi:445:die] /シャワー/: unmatched [] in regexp.
>if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;}

A 回答 (1件)

これは $setubi_o[$i] に入っている文字列の文字コードが、シフトJISであるために起こる問題です。



シャワーの「ー」という字のシフトJISコードは 0x81 0x5B です。
2バイト目の 0x5B は「 [ 」という文字で、これは正規表現のメタ文字でもあります。
このため [ に対する ] がないとして、エラーが起きてしまうのです。

これを回避するためには、
  if($setubi=~ /$setubi_o[$i]/ ){・・・
の行を、
  my $tmp = quotemeta($setubi_o[$i]);
  if($setubi=~ /$tmp/ ){・・・
のように、quotemeta関数を通した値でマッチさせるようにしてください。
※quotemeta は、文字列中のメタ文字をエスケープ(前に \ を付ける)して返す関数です。

ちなみに、同じような効果を持つ \Q~\E を使って
  if($setubi=~ /\Q$setubi_o[$i]\E/ ){・・・
として回避する方法もありますが、他の文字で問題が起こる可能性があるので、利用しない方がよいです。
    • good
    • 0
この回答へのお礼

leaz024 さん

大変助かりました。
また、ご親切な解説に感謝します。
ありがとうございました。

お礼日時:2003/07/02 21:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!