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で質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP PHP ページング データベース 1 2022/06/16 10:30
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTTP::Request::Common qw(POST...
-
perlでuse utf8でsjisのファイ...
-
ディレクトリの判別
-
awkスクリプトでダブルクォーテ...
-
csvファイルの横方向への改行に...
-
FindFirstFileとFindNextFileで...
-
VBAでCSVファイルを途中行まで...
-
Perlで フォルダ内の全て...
-
batファイルでrenameができませ...
-
ファイルの存在の有無を確かめ...
-
エクセルVBAで素数だけを出力す...
-
バッチファイルの作り方(CSV→...
-
Perlの変数に文字数制限(容量...
-
openした後、closeしないでプロ...
-
オープンしたファイルで行の連結
-
ディレクトリ名を取得したい
-
ReadLineでの読み出し行を指定する
-
機器のI/OをArduinoでSDに記録...
-
教えて!perlから.exeファイル...
-
Perl で syntax error
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perl UTF8で出力
-
perlでuse utf8でsjisのファイ...
-
utf-8のCSVをshift_jisに変換し...
-
Perl cgiの文字化けを直したい ...
-
[Perl]Shift-JISのXMLを解析する場
-
ファイル出力をUTF8Nではなくて...
-
Data::Dumper;でダンプ後表示し...
-
Perlの文字コードを意識したフ...
-
sedの動作
-
HTTP::Request::Common qw(POST...
-
消費税の計算で 税込価格から...
-
utf-8での日本語正規表現の書き方
-
Perl utf8上でshiftjisをデコード
-
perlのmysqlで文字化けをする、...
-
じゃらんのAPIでRESTで取得した...
-
perlをwindows環境でshift-jis...
-
DBIモジュールと Perl5.8
-
文字を一文字ずつ区切りたい
-
does not map to shiftjis は解...
-
Pythonでegrep機能をつかいたい
おすすめ情報