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関数を使って上手くできました。
[上に]
[前に]
[次に]