- 締切済み
ファイルから読み込んだ文字を
ファイルから読み込んだ全角文字をあるキーワード(例えば"田中")が含んでいるか否かを判定するプログラムをつくりたいのですが、なかなか上手くいきません。ファイルをopenし中の文字を読込み、それを変数に格納、ifでeq使って判定したのですが、全角は判定してくれません。全角を判定するには一体どうしたら良いのでしょうか? $filename = "####.txt"; open( $fh, "< $filename" ) #ファイルopen or die "Cannot open $file: $!"; $key = 'キ'; #キーワードを決めて while ($c = getc $fh ) { #比較する if($c eq $key){ print "キーワードを見付けました。"; } } close(fh); getcだとおそらく全角は文字コードを読み込んでしまうような感じでしょうか?print $c "\n";とすると文字化けします。しかし、printf("%d", $c);だと何も表示してくれません。これはord関数を使わねばならないのでしょうか?それとも別な方法が?等などためしたのですが、もう分かりません。 御指導御鞭撻をよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
なぜ getcを使おうと思われたのでしょうか? これは(なにもしなければ)バイト単位で取り込みますから、 > while ($c = getc $fh ) { これで $c に入ってくるのは泣き別れしたバイトデータです。 >echo あ|perl -E "while ($c=getc) { say unpack q{H2}, $c}" 82 a0 0a このような泣き別れたバイトデータと任意の多バイト文字を比較しても 決して等しくなることはありません、 どのようなフォーマットのデータなのかわかりませんが、 一行単位とかで読み込んで処理したほうが簡単だと思うのですがどうでしょうか?
- ORUKA1951
- ベストアンサー率45% (5062/11036)
方法 1) 文字列をeuc-jpないしUNICODEに変換する。【必須】 2) パターンマッチを行う この場合、s///g;が楽かも
お礼
返事が遅れました大変申し訳ございません。 getcを使うう理由は一行ずつ読み込むのは私のパソコンではメモリが足りないのか動かなくなってしまいます(セグメントフォルトと表示されます。) getcだと安定して動きます。なぜかは知りませんが、一行ずつよりかは負担が軽いのでしょう、おそらく。 で、getcにて文字列比較は既に解決致しました。 実際文字列を比較出来ましたが、出来ないとかかれていたので?という感じですが、まぁ・・・。