• ベストアンサー

文字列をカウントするにはどうすればいいのでしょうか?

ファイル読み込み後その中の特定の文字列、「映画」の個数をカウントするというプログラムを次のように作ってみましたが、実際に起動してみるとエラーになります。何かわかる方がいれば教えてください。 #!/usr/local/bin/perl if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } foreach $count (@file){ $count = ($line =~ tr/映画/映画/); } print $count; exit;

質問者が選んだベストアンサー

  • ベストアンサー
  • galoon
  • ベストアンサー率28% (38/133)
回答No.1

foreach $count (@file){ $count = ($line =~ tr/映画/映画/); } の部分は foreach $line (@file){ $count = ($line =~ tr/映画/映画/); } じゃないでしょうか? (ループ変数が $count ではなく $line) それから、$countはカウントアップしないと 0/1 になっちゃうような・・・。 それだけではないかもしれないですけど、さしあたり気になったので。

iwaigawa2006
質問者

お礼

ご回答ありがとうございました。とりあえずループ変数をなおしてみました。Perlの文法チェッカーは問題なく通るようになったのですが、サーバ上で動作させると「500 internal server error」となり、動作しません。何かほかに原因が考えられますでしょうか?それからカウントアップの方法は具体的にはどうすればいいのでしょうか?初歩的な質問ばかりですいません。

その他の回答 (2)

  • galoon
  • ベストアンサー率28% (38/133)
回答No.3

ANo.1です。 簡単に変更してみました。 1行の中に複数の文字列が見つかってもカウントは1です。 見つかった数だけカウントアップしたい場合にはもう少し複雑になります。(ほんのちょっとだけ) --- ここから --- #!/usr/local/bin/perl if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } # カウント初期化 $count = 0; foreach $line (@file){ # '映画'という文字列が含まれているか確認する。 $position = index($line, '映画'); # 存在したらカウントアップ if ($position >= 0) { $count = $count + 1; } } print $count; exit; --- ここまで ---

iwaigawa2006
質問者

お礼

丁寧に解説していただきありがとうございました。参考になりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>internal server よくわからんけど ヘッダを書き出してないですが、大丈夫ですか >カウントアップの方法 $count+=数; あと、trを使って"映画"を正しくカウントすることはできません。 映,画あるいは、それぞれのバイト毎動作するためです。

iwaigawa2006
質問者

お礼

ご回答ありがとうございます。確かめてみます。

関連するQ&A