PERLのパターン照合 =~ は日本語を扱えない?

[上に] [前に] [次に]
ピンプ [E-Mail] 1998/06/25(木) 23:19:08
perlで名前登録ページを作っているのですが、現在登録されてる
名前が再度登録されないように、名前が存在するかどうか確認して
から登録を行いたいのですが、どうもパターン照合でエラーが出る
ようです。
実際には、下のように、

sub check_name {
  open(OUT,"$HOME/.jnames");
    while(<OUT>) {
      if ($_ =~ /$in{'name'}/){
        &existing_name;
        exit;
      }
    }
    close(OUT);
}

という感じなんですが。日本語をこれに渡すとエラーがでます。
これと同じような処理をするにはどう書けばいいのでしょうか?

>> perl -v
perl version 5.004_04 built for i386-freebsd

B-Cus 1998/06/25(木) 23:39:03
スクリプトがEUCで書いてあるなら、
 open(OUT,"nkf -e < $HOME/.jnames |");
などと、入力をEUCに変換したらどうなりますか?

スクリプトがJISならnkf -jかな(ためしてません)。


ところで、普通はOUTっていったら書き込み用じゃないですかね。

ピンプ [E-Mail] 1998/06/26(金) 08:55:53
一応スクリプト、.jnamesファイルともにJIS何ですが、
nkfでパイプしてみたらエラーは出なくなりましたが、
チェック自体を行なってくれなくなりました・・・・

ごめんなさい、PERL初心者なんで <OUT

mo [E-Mail] 1998/06/26(金) 10:48:42
if ($_ =~ /$in{'name'}/)
の部分に問題があります。$in{'name'} が展開されたときに
正規表現の特殊文字が含まれていると、それが解釈
されてしまいます。

if ($_ =~ /\Q$in{'name'}\E/) { ... } # \Qから\Eまでの記号をエスケープ
とするか、あるいは
if (index($_, $in{'name'}) >= 0) # サブ文字列のチェック
とするのはどうでしょうか。

でも、単に同じ文字かどうかのチェックなら、
if ($_ eq $in{'name'}) { ... }
のように eq 十分でしょう。

ピンプ [HomePage] 1998/07/01(水) 15:32:16
[[解決]]
moさんどうもありがとうございました。
index関数を使って上手くできました。

[上に] [前に] [次に]