• ベストアンサー

この変数はどういう扱い?

とある書籍で簡単なアクセスログの作り方について勉強している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行目ではどのように何が実行されているのでしょうか? アドバイスやご教授をよろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • danmarino
  • ベストアンサー率63% (26/41)
回答No.1

++$freq[$hour]; は@freqという配列の$hour番目の要素に1を足す、という意味です。 アクセスログということですので、結果、$freq[0]に0時台の件数、$freq[1]に1時台の件数、…$freq[23]に23時台の件数ということになるかと思います。

thank001
質問者

補足

danmarinoさん、書き込みありがとうございます。 例えば、$a[5]=1 というコードを用意した時点で、 @a = ("0","0","0","0","0","1") という配列が用意された事と同じ意味合いになるという事なのでしょうか? お手数ですが、もしよろしければまた一度書き込みをいただければさいわいです。 よろしくお願いします。

その他の回答 (1)

  • is907
  • ベストアンサー率55% (5/9)
回答No.2

$a[5] = 1; は、@a = ('0','0','0','0','1') では無く、@a = (undef,undef,undef,undef,1); になります。 undef とは未定義という意味です。 $a[3] などを defined() してみると、違いが分かります。

thank001
質問者

お礼

is907さん書き込みありがとうございます。 早速、試してみて理解がいきました。 defined()もはじめて知ったので大変参考になりました。 お二人のおかげて理解する事ができました。 大変助かりました。 ありがとうございました。

関連するQ&A

  • CGI.pmで取得したファイルハンドルを変数にいれるとファイル名のみになる・・・

    perlにて、 use CGI; my $q = new CGI; my $ufh = $q->upload('file'); などで$ufhにファイルハンドルを受け取り、 この直後で、アップロードなどを行うと正常に行われるのですが、 別の関数に渡してからアップロードを行うとファイル名がついた0バイトのファイルがアップロードされます。 &test($ufh); test($){ $filename = $_[0]; while(read($filename , $buffer, 1024)){ $file .=$buffer; } my $basename; my $exp; my $files; my $newfile; my @files = split(/\\/, $file_name); ($basename, $exp) = split(/\./, $files[-1]); $newfile = $basename . "." . $exp; open(FILE, "> /tmp/$newfile"); binmode(FILE); print(FILE $files); close(FILE); } ファイルハンドルを変数に格納して持ちまわすことはできないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • preg_match( '/^(\D+)(\d*)$/' , $変数 , $regs )

    if( ! preg_match( '/^(\D+)(\d*)$/' , $変数1 , $regs ) ) { echo ( 'invalid dirname: ' . htmlspecialchars( $変数1 ) ); } $変数2 = $regs[2] === '' ? '' : intval( $regs[2] ) ; 正規表現だと思うのですが、どういう意味か教えてください。 □分からないなりに考えてみました… ▽1行目 $変数の内容が、'/^(\D+)(\d*)$/'にマッチしなければ、$regs へ代入。 ▽2行目 マッチしていた場合は、htmlspecialchars関数を実行した後、'invalid dirname: '+その結果を表示する。 ▽3行目 $regs配列変数の1番目を、何かして、$変数2 へ代入する。 ……誰か教えてください…。

    • ベストアンサー
    • PHP
  • テキストの内容を変数に代入

    テキストの内容を変数に入れたいのですが、 改行している部分で読み込みが終わってしまうのですが どのようにすればいいのでしょうか? 下のプログラムでは1行しか変数に代入できません。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include<stdio.h> main(){ char a[500]; FILE *fp; fp = fopen("****.txt","r"); fscanf(fp,"%s",&a); fclose(fp); return 0; } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ whileで回すと上手くいくとは思ったのですが、fscanfを回しても 上手くいかずわかりません。 whileとfgetsを使ってもみたのですがよくわかりませんでした。 教えて頂けたら幸いです。

  • ある程度変数名に規則性のある連続したファイルのデータをスマートに読み込みたいのですが

    お世話になります 各々変数が<>で区切られたファイルを開いて、各々の変数に代入したいと思います 変数の内容は $no,$arg_0,$arg_1,$arg_2,$arg_3....,$arg_34,$p1.$p2,$p3 とかなり大きなデータ構造です、普通に open(IN,"$logfile") || &error("Open Error : $logfile"); while (<IN>) { ($no,$arg_0,$arg_1,$arg_2,$arg_3,....$arg_34,$p1,$p2,$p3) = split(/<>/); if ($no == $in{'no'}) { last; } } close(IN); とすれば、多分問題なく実行出来るのですがあまりにも芸もなくソースも見ずらい ものになってしまいます、スマートな書き方を教えて頂けないでしょうか宜しくお願いします。

    • ベストアンサー
    • Perl
  • VB6で、変数の値を別ファイルの変数に引き継ぎたい

    AというVBのソースファイル(.frm)内に関数の呼び元があり、 その関数がBというファイルにあります。 その関数内で値が設定される変数を、Bファイルのグローバル変数とし、 また、Aファイルのグローバル変数として同じ名前の変数を宣言したとしても、 やはりB内で関数の実行が終了し、Aに戻った際には、変数は別のものとみなされている ようで、B内関数で設定された値がAファイル内での同名変数に引き継がれません。 どのようにすればよろしいでしょうか? ご存知の方、お願いします。

  • モーメント母関数は、なぜexp(tX)なのか?

    なぜexpなのか、そしてtはどこから来たのかについて、教えてください。 確率変数を関数化(一般化)するという思想までは自然に理解できるのですが、その関数は何故tanでもlnでもなく、expなのでしょうか?

  • listで変数代入

    あらかじめ、データ行のデータ数がわかっていれば、listで変数へ代入してあげれば問題ないと思いますが、データによってはデータ行のデータ数が10個とかそれ以上になると、その分だけlist($data_○.......................)とすると面倒なので、簡単に行のデータ数をカウントしてlist関数を使った方法で処理する方法はないのでしょうか? $data_01とかアンダーバー末尾数字みたいな方法でlist($data_01,$data_02,$data_03,,,,,,,,,,,,,,,,,,,,,)として変数に代入したいで教えて下さい。 sample.csv りんご1,ばなな1,いちご1 りんご2,ばなな2,いちご2 りんご3,ばなな3,いちご3 define(csvdata, "sample.csv"); $data = file(csvdata); for ($i = 0; $i < count($data); $i++) { list($data1,$data2,$data3) = split(",", $data[$i]);

    • ベストアンサー
    • PHP
  • String変数を分割するメソッドってありますか?

     urizakaです。  さて、現在データベースから検索して持ってきたデータ(住所データです)をString変数に代入し、そのデータを一定ルールで区切って、区切った間に改行コードを入れるという処理を考えているのですが、javaにはVBAのsplit関数みたいなものってあるのでしょうか?JavaScriptにはあるみたいなので、Javaにもあるのではないかとは思うのですが…

    • ベストアンサー
    • Java
  • テキストファイルを読み込み変数に保存

    phpでテキストファイルを読み込んでその読み込んだ内容を変数に保存したいと思っているのですがうまくいかないのでおしえてください 例 1111 2222 3333 4444 というテキストファイルがあったとしたら 変数名 = 1行目; 変数名 = 2行目; としたいのですがどうすればできるのでしょうか?

    • 締切済み
    • PHP
  • redoを実行するとスカラー変数の値がundefになってしまうのはどうしてでしょうか?

    はじめまして。 質問があります。 まずは以下のコードを見てください。 ---------------------------------------------------------------- use strict; use warnings; open(FILE,'redo01.txt') or die "$!"; while(my $line = <FILE>) { print "undef\n" unless( defined($line) ); chomp($line); if($line =~ /---$/) { $line .= <FILE>; redo; } print $line,"\n"; } close(FILE); ---------------------------------------------------------------- --redo01.txt---------------------------------------------------- zero--- one--- two--- three--- four ---------------------------------------------------------------- ファイルから一行を読み込んできてスカラー変数$lineに代入して、 redoを実行しながら$lineの値をどんどん連結していき最後に文字列を 表示させようと思っていたのですが、なぜかredoを実行後 ループ内の先頭行に制御を移してから$lineの値を調べてみると、 undefになってしまいます。事実、chomp()関数やパターンマッチ、 print関数を実行すると、エラーになってしまいます。なぜ$lineの値 がundefになってしまうのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう