アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイルを読み込んで、その中の特定の文字列たとえば"映画"が何個あるかを調べるプログラムを作っているのですが、動作しません。ファイルには、改行やタブが入っているのですが、問題はファイルの読み込み方なのか、カウンタの方なのか分かりません。次がプログラムですので何か分かる方は教えてください。

if (open(FH, "data/log.txt")) {
@file = <FH>;
close(FH);
}
while(<STDIN>){
$movie=0;
if(@file == "映画" ){
$movie++;
}
print $movie;
}

A 回答 (3件)

問題なのはカウンタ部分です。


プログラムの一文一文がどういう動作をするのか、しっかり理解しましょう。

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;

補足日時:2006/01/13 12:55
    • good
    • 0
この回答へのお礼

間違って、お礼より先に補足のほうに書いてしまいましたが、ご回答のお礼申し上げます。

お礼日時:2006/01/16 16:08

こんな感じでイイと思います。


if (open(FH, "data/log.txt")) {
local $/ = undef;
$file = <FH>;
close(FH);
}
$movie=($file=~s/映画/映画/g);#trはうまくない
print $movie;
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。早速ためさせていただきます。

お礼日時:2006/01/16 16:07

箇数が知りたいだけなら全てを @file に入れる必要はありません。

(後で内容を別のことに使う場合は別ですが)。

で、行の中に「映画」が何個含まれているかは

$count = 0;

$count++ while(/映画/g);

で出せます。(これは $_ に対して比較しているので $_ =~ /映画/g と同じです)。

ファイル全体ということならばこんな感じでしょう。

open(F, '< ファイル名') or die;
$count = 0;
while (<F>) {
 $count++ while (/映画/g);
}
close(F);

但し行末に「映」があって次の行頭に「画」がある場合はこれでは数えられません。そういうのもカウントしたい場合はやはり全部読んだ方が簡単です。読むとメモリが足りなくなるぐらい大きいファイルの場合は行末の1文字が「映」の場合にそれを記録しておき、次の行を読んだ時に先頭が「画」かどうかを調べるということをすればできます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。大変参考になりました。試してみたいと思います。

お礼日時:2006/01/16 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!