• ベストアンサー

utf-8での日本語正規表現の書き方

WindowsXPでPerlの正規表現の勉強をしています。 下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。 use utf8; use encoding ("utf-8"); # 例1################################## $str1 = "そろそろ夏も終わりですね。"; $str2 = "夏"; if ($str1 =~ /夏/) { print "例1の答え: 含まれています \n"; } else { print "例1の答え: 含まれていません \n" } # 例2 ################################### $count = 0; open(FH, "C:\\temp\\hoge.txt"); while(<FH>) { if (/夏/) { $count++; } } print "$count \n";

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

実はPerlのUTF8文字列には二種類あります。 とか断言しちゃうといいすぎなんですが、例1でのUTF8文字列には 「UTF8フラグ」というものがついています。その一方で例2の ファイルから読み込んできたものにはこの「UTF8フラグ」はついていません。 このため、スクリプト中の'夏'と外部ファイルにあった'夏'とが 同じものとはみなされなかったために質問にあるような結果になります。 #1の回答でhimajin10000さんがやっているようにファイルのオープンを すると、こんどはUTF8フラグがついた状態でファイルからの読み込みが 行われます。そうすることで二つの'夏'が同じであると認識されるように なったわけです。 use utf8や use encoding 'utf8' というのはただ単にスクリプトが utf8で書かれていることを明示するプラグマではありませんので 注意が必要です。 Perl 5.8.x Unicode関連 http://www.rwds.net/kuroita/program/Perl_unicode.html

nonolamy
質問者

お礼

早速のご教示ありがとうございました。 問題が解決しました。 "utf8フラグ"とは重要なものだったのですね。 (以前何かで読んだような記憶がありますが 素通りしていました。) 参考URL早速見せて頂きました。 知りたかったことが盛り沢山で感謝です。 ありがとうございました。

その他の回答 (1)

回答No.1

use utf8; use encoding ("utf-8"); # 例1################################## $str1 = "そろそろ夏も終わりですね。"; $str2 = "夏"; if ($str1 =~m/夏/) { print "yes\n"; } else { print "no\n"; } # 例2 ################################### #よくわからんが読むときにutf-8を指定してみた。 #http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/perl/perl_utf.html $count = 0; open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-1\.txt"); while($fuga = <FH>) { if ($fuga =~m/夏/g) { $count = $count + 1; #行数 } } print "$count \n"; $count = 0; open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-2\.txt"); while($fuga = <FH>) { while ($fuga =~m/夏/g) { $count = $count + 1; #個数(一行に複数含まれる) } } print "$count \n"; $count = 0; open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-3\.txt"); while($fuga = <FH>) { while ($fuga =~m/aaa/g) { $count = $count + 1; #aaaaaの時には最初の1回しか検出されない。(3個ではない!)aaaaaaなら2個 } } print "$count \n"; #========================Q3365289-1.txtおよびQ3365289-2.txt=========== #そろそろ夏も終わりですね。夏 #夏 #========================Q3365289-3.txt========= #aaaaa #出力結果 #yes #2 #3 #1

nonolamy
質問者

お礼

詳細な例を使ってのご教示ありがとうございました。 お教えの通りやりますとマッチするようになりました。 どうもありがとうございました。

関連するQ&A