- ベストアンサー
この変数はどういう扱い?
とある書籍で簡単なアクセスログの作り方について勉強しているperl初心者です。 下記のコードで2行目までは理解できるのですが、3行目の++$freq[$hour];が理解できずに困っています。ここまでに $freq や@freq という変数や配列など出てきていないのですが、この場合のfreqはどのような命令実行になるのかが理解できずにいます。 while($ln = <FILE>) { ($hour,$min,$host,$refer,$agent) = split(/\t/, $ln); ++$freq[$hour]; } 1行目、ハンドル名FILEで開かれているファイルの1行目を読み込んで変数lnに代入。 2行目、split関数で、$lnの変数値を\t 区分毎に分解し、各変数に代入。 3行目を実行。 最初に戻る。 1行目2回目で、ハンドル名FILEで開かれているファイルの2行目を読み込んで変数lnに代入。 2行目で、split関数で・・・・・・・ ・ ・ 1行目?回目で、ハンドル名FILEで開かれているファイルの?行目から文字列がないので、whileを抜ける。 上記のような形で説明するとすると、3行目ではどのように何が実行されているのでしょうか? アドバイスやご教授をよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
++$freq[$hour]; は@freqという配列の$hour番目の要素に1を足す、という意味です。 アクセスログということですので、結果、$freq[0]に0時台の件数、$freq[1]に1時台の件数、…$freq[23]に23時台の件数ということになるかと思います。
その他の回答 (1)
- is907
- ベストアンサー率55% (5/9)
$a[5] = 1; は、@a = ('0','0','0','0','1') では無く、@a = (undef,undef,undef,undef,1); になります。 undef とは未定義という意味です。 $a[3] などを defined() してみると、違いが分かります。
お礼
is907さん書き込みありがとうございます。 早速、試してみて理解がいきました。 defined()もはじめて知ったので大変参考になりました。 お二人のおかげて理解する事ができました。 大変助かりました。 ありがとうございました。
補足
danmarinoさん、書き込みありがとうございます。 例えば、$a[5]=1 というコードを用意した時点で、 @a = ("0","0","0","0","0","1") という配列が用意された事と同じ意味合いになるという事なのでしょうか? お手数ですが、もしよろしければまた一度書き込みをいただければさいわいです。 よろしくお願いします。