- ベストアンサー
ファイル内で重複している数と重複した回数
開くファイルの中身は数字のみ。 1行に一つずつ数字が入っており、 それが何行にもわたり続くファイルです。 ファイル内で重複している数と重複した回数を数えたいです。 以下のようなスクリプトを使ったのですが、 結果を表示させようとすると global symbol"$hash" requires explicit package name. にエラーが出ます。 何故なのでしょうか。 use strict; # ファイルを開く my $INPUT_FILE; open ($INPUT_FILE, ">numbers.dat") or die “Can't open. \n”; # それぞれの数をハッシュキーにする。そして対応するバリューを同じ数を見つける度毎にカウントアップする。 my %hash = (); while (my $line = readline($INPUT_FILE)) { chomp $line; $hash{$line}++; } # キーでソートし、結果を表示する。 my @keys = sort keys %hash; foreach my $key (@keys) { print “$key is found $hash{$key} times\n”; } close ($INPUT_FILE) or die “can't close the file\n”;
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ん~, 手元では問題ないけどなぁ.... ちなみに 2点ほど疑問: ・なんで ">number.dat" なの? ・die のあとの文字列の引用符が全角なのはなぜ?
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
「どうにも動かない」と言われても, どんなプログラムを使っているのかわからないんだからどうしようもないです. そもそも最初に挙げられたプログラムから間違ってるんだし. 実際に使っているプログラムを示せませんか? ちなみに my で宣言した変数を使って open でファイルハンドルで autovivify するのは, 「my のスコープが終わったときに勝手にファイルを close してくれる」というメリットがあります>#3.
- kumoz
- ベストアンサー率64% (120/185)
エラーの対象が "%hash" ではなくスカラー変数の "$hash" ですので、 実際のコードでは何らかの書き間違いがあるのではないかと思います。 例えば、次のように書くと質問のようなエラーが出ます。 print "$key if found $hash {$key} times\n";
補足
エラーは消えました。ありがとうございます。 でも、次は何も表示されないままになってしまいました。 ここでは書き忘れたのですが、while文はサブルーチン内に入っています。どうにも動きません。 アドバイスを頂ければ、幸いです。
- pipipi523
- ベストアンサー率40% (148/365)
global symbol"$hash" requires explicit package name. は、 use strict; を入れているからでは?消して実行してみてください。 (ちなみにWindowsのActivePerlではエラーになりませんでした。外していたらすみません) その他 ・">numbers.dat"の場合は出力モードになるので、 実行するとnumbers.datの中身が空になります。>は消しましょう。 ・openの第一引数はファイルハンドルでなので、 my $INPUT_FILE; open ($INPUT_FILE, "numbers.dat") or die "Can't open. \n"; ではなく、 open (INPUT_FILE, "numbers.dat") or die "Can't open. \n"; としたほうがいいと思います。(変数名を書くと動くにしてもちょっと気持ち悪い)
お礼
ご回答いただき ありがとうございます。 ここでは書き忘れたのですが、while文はサブルーチン内に入っています。サブルーチンを外すと確かに正常に動きました。なぜサブルーチンに入れた瞬間に表示されないようになってしまうのでしょうか。 コメントを頂ければ、幸いです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
これってホントに使ってるソースですか?
補足
なんで ">number.dat" なの? ---reading用にファイルを開きたかったからです。 die のあとの文字列の引用符が全角なのはなぜ? ---特に意味はありません。