
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";
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 …
早速のご教示ありがとうございました。
問題が解決しました。
"utf8フラグ"とは重要なものだったのですね。
(以前何かで読んだような記憶がありますが
素通りしていました。)
参考URL早速見せて頂きました。
知りたかったことが盛り沢山で感謝です。
ありがとうございました。
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/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
詳細な例を使ってのご教示ありがとうございました。
お教えの通りやりますとマッチするようになりました。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl cgiの文字化けを直したい ...
-
【エラー】Unrecognized character
-
エクセルVBA コードが同じでも...
-
JavaでCSVファイルを高速に読む...
-
@の配列変数ではなく$のスカラ...
-
パスから最後のディレクトリだ...
-
drtファイルはどうしたら開...
-
MATLAB グローバル変数の宣言
-
VBAでCSVファイルを途中行まで...
-
正規表現で、特定のファイル名...
-
Perlの変数に文字数制限(容量...
-
C言語で特定の行を抽出する方法...
-
ディレクトリ内のtxtファイル中...
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
【Access2003】VBAでタブ区切り...
-
openした後、closeしないでプロ...
-
WindowsでPerlをする際,1行目の...
-
Edge スクレイピング
-
fopen64について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl cgiの文字化けを直したい ...
-
vimでのutf8の取扱について
-
perl5.8.3のunicode環境で日本...
-
ファイル出力をUTF8Nではなくて...
-
csv2wiki.plのエンコーディング...
-
utf-8での日本語正規表現の書き方
-
<STDIN>とARGVとの振る舞いの違...
-
[Perl]Shift-JISのXMLを解析する場
-
Perl出力をUTF-8に指定する方法
-
Perl UTF8で出力
-
HTTP::Request::Common qw(POST...
-
[perl5.8] SJISで出力したはず...
-
perlをwindows環境でshift-jis...
-
Perlの文字コードを意識したフ...
-
Perl utf8上でshiftjisをデコード
-
does not map to shiftjis は解...
-
文字を一文字ずつ区切りたい
-
初心者で、困っています。(文...
-
perlの自作ライブラリについて
-
複数種類の括弧でくくられてな...
おすすめ情報