• ベストアンサー

ファイルの最後の行から表示させる(最新情報を5回分だけ表示)

natsuki_tkの回答

回答No.3

微妙に気になるのですが、 データファイルは常に最大5行なのでしょうか? >新しい情報を5回分だけ表示する様にしたかったのですが は、例えば100行から5回分だけなのか、 それとも5行から5回分(つまり全部)なのかが気になります。 (別の方法でデータが増えたりするなどして) #一行追加と一行削除 push @list,$newline; shift @list if scalar(@list)>5; 色々あると思います。 $#data使ったりとか…。 #表示 foreach (reverse @list){   print "$_\n"; } ごく普通に? 仮に5行止まりでなくて例えば100行中5行表示だとしたら、 #表示 foreach (reverse @list[-5..-1]){   print "$_\n"; } とでもすることになるのでしょうか。 読みにくい気もしますけれど。 データ量が多くないのであれば、 一括で配列に読み込んで処理すると楽で、かつ読みやすいと思います。 あとはループ変数なるべく使わないようにすると 見た目がスマートに?見えるかもしれません。

meikenpochi
質問者

お礼

natsuki_tkさん、回答ありがとうございます。 >データファイルは常に最大5行なのでしょうか? 常に最大5行にする様にファイルを編集する様にしたいと思っています。一括で配列に読み込んで処理する方法が良いですね。

関連するQ&A

  • 新しいログの書き込み

    新しいログを追加で上に書き込む方法はどのようにしたらよいのかアイディアがありません。 ご教授願います。 if($mode eq "html"){ flock(FH, LOCK_EX); open(FH,"${datafile}"); @html = <FH>; close(FH); flock(FH, LOCK_NB); $html = join('',@html); @html = split(/$chtml/ , $html); $html[1] = $data; $html = join($chtml,@html); flock(FH, LOCK_EX); open(FH,">$datafile"); print FH $html; close(FH); flock(FH, LOCK_NB);

  • レコードの書込み判断

    ファイルを読込み、読込まれたレコードの39桁目が0であれば出力という判断を下記のコーディングに追加したいのですが、どのように記述すればよいでしょうか? if(open(OUT,">$year$mon$mday$csv")){  for my $fname (sort @dirs){   if(open(IN,"$fname")){   my @lines = <IN>;   print OUT @lines;   close(IN);   }  }  close(OUT); }

  • ファイルのロックについて

    ファイルのロック方法を下記の様にしてロックさせていますが、同時ににアクセスが合ったときにどちらかが$add_text;を書きこまれないので順次書き込まれる様にしたいのですが、何方かご教授してもらえませんか? #!/usr/bin/perl use Fcntl ':flock'; open(ADD_DB,">>$log"); flock(ADD_DB, LOCK_EX); print ADD_DB "$add_text;\n"; flock(ADD_DB, LOCK_NB); close(ADD_DB);

    • ベストアンサー
    • Perl
  • ログファイルの指定行に書込み

    open(IN,"$log") || &error("Open Error"); @data = <IN>; close(IN); while (100 <= @data) { pop(@data); } open(OUT,">$log") || &error("Write Error"); print OUT "$in{'id'}<>$in{'comment'}\n"; print OUT @data; close(OUT); ログにはID、時間、コメントが登録されています。 送信データの中に、ログに登録済みのIDがある場合には、そのIDのある行のみを書き換えたいのですが、方法がどうしてもわかりません。 $logに記録されるIDの順番は以下のようにランダムです。IDに登録される文字列は1からの数値のみです。 52<>コメント 120<>コメント 35<>コメント 8<>コメント 2<>コメント 19<>コメント 85<>コメント よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • cgiログファイルの書き込みに余計なスペースが入る。

    ---------- #ここでログファイルに書き込みを行う。 open(FH,">>log.log"); print FH"ID=$ID&COUNT=$COUNT\n"; close(FH); #ログファイルをさらに開く。 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; ログファイルを並び替えてその順番で書き込み。 $gyou = @log; @sort=sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; print "<FONT COLOR=RED>@sort</FONT><BR>\n"; open(FILE2, ">log.log"); print FILE2"@sort"; close (FILE2); ---------- というように行っていますが、一番最初のID=01&とかの前に半角スペースが入ります。 下の行に行くほどスペースが増えます。 どこが原因でしょうか?

    • ベストアンサー
    • Perl
  • CSVの条件出力について

    ディレクトリー内のCSVを1ファイルにするルーチンで、現在46カラム目から3桁が"000"なら出力としている判断を、5項目めが"000"ならに変更したいのですが、どのようにすればよいでしょうか? 現在の記述は下記の通りです。 if(open(OUT,">$path/$year$mon$mday$csv")){ for my $fname (sort @FTPlist){ if(open(IN,"$path/$fname")){ while (<IN>) { $sip = substr($_,46,3); if ($sip == "000") { print OUT "$_"; } } close(IN); } } close(OUT); }

    • ベストアンサー
    • Perl
  • 複数のCSVを1つのファイルにまとめる

    リモートからダウンロードしたCSVファイルをひとつにまとめる処理をしています。 ダウンロードするリストファイルとCSVファイルのダウンロードはできたのですが、最後にダウンロードしてきたCSVファイルをひとつにまとめるところがうまくいきません。 こちらの過去ログから下記記述してみたのですが、うまくいきません。 if(open(OUT,">$path/$year$mon$mday$csv")){      for my $fname (sort @dirs){        if(open(IN,"$path/$fname")){          my @lines = <IN>;          print OUT @lines;          close(IN);        }     }     close(OUT);   } for my $fname (sort @dirs){の記述で、Unrecognized characterといったエラーが出てうまくいきません。 項目の設定に誤りがあるのでしょうか?perl初心者でよくわかりません。 $fnameや@dirsはどのように設定すればいいのでしょうか?

    • ベストアンサー
    • Perl
  • 画像とtxtファイルの表示

    現在CGIでtxtファイルが表示されるように print "Content-type: text/html; charset=euc-jp\n\n"; $count = 0; $viewline = 1; open(IN, "A.txt"); while(<IN>){ if($count == ( $viewline - 1)){ $line = $_; last; } $count++; } close(IN); print "$line\n"; としています。 ここでさらに画像も一緒にCGIで表示させたいのですが、そうゆうことはできるのでしょうか? できるのであれば教えて頂きたいです。調べてみたのですがなかなか見つからなくて・・・。 よろしくお願いします。

    • 締切済み
    • CGI
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • 初心者で、困っています。(文字化け)

    すみません、すごく初歩的なことで困っています。 本を見ながら、下のようなものを書いたのですが、 出力すると、文字化けをしてしまいます。ウィンドウズの環境で、Perlは5.8を使い、読み込みのテキストはUnicodeです。どのようにすれば、文字化けをしないで、読み込めるのでしょうか。 open ( IN , "LBa3_00028.txt" ) or die; open ( out , ">out.txt" ); while ( $line = <IN>){ print out "$line\n"; } close(out); close(IN);

    • ベストアンサー
    • Perl