アプリ版:「スタンプのみでお礼する」機能のリリースについて

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";

A 回答 (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 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/22 08:22

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/pe …


$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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/22 08:18

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