From canada@kt.rim.or.jp Sun Mar 15 09:51:57 1998 Path: kt.rim.or.jp!t3.rim.or.jp!st.rim.or.jp!not-for-mail From: canada@tt.rim.or.jpp (Canada, Masakatz) Newsgroups: fj.lang.perl Subject: Re: 掲示板 Date: 19 Feb 1998 07:30:59 GMT Organization: RIMNET Lines: 66 Message-ID: <6cgn3j$rn0$1@news.st.rim.or.jp> References: <6c9fbn$gcl$1@news01.osaka.sannet.ne.jp> <6cetv2$nde$1@news.kt.rim.or.jp> <6cf1b9$5qd$1@news2.dti.ne.jp> NNTP-Posting-Host: blue012.rimnet.co.jp Mime-Version: 1.0 Content-Type: Text/Plain; charset=ISO-2022-JP X-Newsreader: WinVN 0.99.7J PL01 (x86 32bit) Xref: kt.rim.or.jp fj.lang.perl:2920 In article <6cf1b9$5qd$1@news2.dti.ne.jp>, sabre@vc-net.or.jp says... >>さて、仮に件のオーバーフローの原因を、逆順ソートのためと仮定す >>るならば、何もファイルを分割しなくても回避することは十分可能です。 >興味があります。 ちょっと作ってみました。ファイルを逆順にソートして出力させる ものです。方法が汚い上きちんとテストはしていませんが、期待し た動作は一応するようです。 動作としては、print reverse ; とほぼ同じです。 --- begin tac.pl --- #!/usr/local/bin/perl $bufsize = 1024; # ここの値は適当に変える open(FILE,$ARGV[0]) || die; $size = -s FILE || exit; # $pos: FileSizeをBufferSizeで割った値の小数点以下を切り上げた数 $pos = int($size / $bufsize) + ($size % $bufsize > 0); while($pos--){ seek(FILE, $bufsize * $pos, 0); read(FILE, $_, $bufsize); $_ .= $oldbuf; @lines = split(/\n/); $oldbuf = shift(@lines); print join("\n", reverse @lines), "\n"; } print $oldbuf; close(FILE); --- end tac.pl --- 実行結果です。 #syslog: 約200KB % time ./tail.pl /var/log/syslog > /dev/null 0.200u 0.060s 0:00.25 104.0% 0+247k 0+0io 0pf+0w ちょっと遅いですが、実行時間の約8割はsplit(/\n/)に食われて いるので、このあたりを何とかするともう少し速くなるのかな? >ファイル先頭に記事を挿入とは、どうやるのですか? >ファイル末尾なら、知っているのですが。 open (FILEOUT, ">>log.txt"); えーと、いきなり先頭に挿入するのは多分無理なので、 一時ファイルを使う方法がありますね。 まず一時ファイルを新しくオープン 先に一時ファイルに記事を出力 そのあと一時ファイルに記録ファイルの全文を追加 記録ファイルを一時ファイルと差し替える 。。。とか。 >でも、tail を呼び出すのもちょっと嫌なので、 >できれば、tail を、perlでエミュレートしたいです。 上のような方法で末尾から少しずつ読んで行って、 改行文字が合計11個になったところで読むのを止めれば いいんではないでしょうか? かなだまさかつ canada@tt.rim.or.jpp^H