- 締切済み
文字列をカウントする方法
ファイルを読み込んで、その中の特定の文字列たとえば"映画"が何個あるかを調べるプログラムを作っているのですが、動作しません。ファイルには、改行やタブが入っているのですが、問題はファイルの読み込み方なのか、カウンタの方なのか分かりません。次がプログラムですので何か分かる方は教えてください。 if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } while(<STDIN>){ $movie=0; if(@file == "映画" ){ $movie++; } print $movie; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- noboru2000
- ベストアンサー率33% (47/140)
箇数が知りたいだけなら全てを @file に入れる必要はありません。(後で内容を別のことに使う場合は別ですが)。 で、行の中に「映画」が何個含まれているかは $count = 0; $count++ while(/映画/g); で出せます。(これは $_ に対して比較しているので $_ =~ /映画/g と同じです)。 ファイル全体ということならばこんな感じでしょう。 open(F, '< ファイル名') or die; $count = 0; while (<F>) { $count++ while (/映画/g); } close(F); 但し行末に「映」があって次の行頭に「画」がある場合はこれでは数えられません。そういうのもカウントしたい場合はやはり全部読んだ方が簡単です。読むとメモリが足りなくなるぐらい大きいファイルの場合は行末の1文字が「映」の場合にそれを記録しておき、次の行を読んだ時に先頭が「画」かどうかを調べるということをすればできます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
こんな感じでイイと思います。 if (open(FH, "data/log.txt")) { local $/ = undef; $file = <FH>; close(FH); } $movie=($file=~s/映画/映画/g);#trはうまくない print $movie;
お礼
ご回答ありがとうございます。早速ためさせていただきます。
- twinkleluz
- ベストアンサー率52% (98/185)
問題なのはカウンタ部分です。 プログラムの一文一文がどういう動作をするのか、しっかり理解しましょう。 if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } ここまでで、読み込んだファイル(data/log.txt)の内容は@fileという配列に読み込まれています。 あとは、foreachループを使って@fileの中から1行ずつ取り出し、それぞれに"映画"の文字がいくつ入っているかを数えます。 文字列の中に"映画"の文字がいくつ入っているかは、 $count = ($line =~ tr/映画/映画/); と書くと、$countに$line中にある"映画"の文字の数が入ります。 あと、$movieの初期化はループの外でしないといけません。 これだけのヒントでプログラムが組めます。あとは自力で頑張ってみてください。
お礼
間違って、お礼より先に補足のほうに書いてしまいましたが、ご回答のお礼申し上げます。
補足
次のように作ってみましたが、実際に起動してみるとエラーになります。まだどこかおかしいでしょうか? #!/usr/local/bin/perl if (open(FH, "data/block.txt")) { @file = <FH>; close(FH); } foreach $count (@file){ $count = ($line =~ tr/映画/映画/); } print $count; exit;
お礼
ご回答ありがとうございます。大変参考になりました。試してみたいと思います。