
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ランキング
-
#!/usr/bin/perlで書きだしたCG...
-
perlのrequireの動き方について...
-
perl の open について教えてく...
-
ファイルをディレクトリ分配の...
-
perlでリテラル値はメモリにど...
-
Perlでファイルの末尾から指定...
-
テキストファイルで提出とは?
-
Perlプログラムについてファイ...
-
[perl] perlで書き込み中に、PC...
-
Perl言語について。
-
アルファベットに付いて質問し...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
マンスリーランキングこのカテゴリの人気マンスリー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の自作ライブラリについて
-
複数種類の括弧でくくられてな...
おすすめ情報