perl的文件输出

perl的文件输出

一个log文件,希望输出最后20行,怎么做呢?
tail -n 20 file
这个是shell里面的吧?perl里面貌似不能这样用哦。


QUOTE:
原帖由 cindy9902 于 2009-1-4 13:56 发表
一个log文件,希望输出最后20行,怎么做呢?



[Copy to clipboard] [ - ]
CODE:
open my $log_fh, "log_file" or die "Can't open log_file:$!";

my @last = (<$log_fh>)[-20 .. -1];
print @last, "\n";

当然,如果 log_file 本身很大的话,这么做是成问题的。
是的,文件比较大。使用了一个笨的办法,用shell命令tail -n 20 file。
再把得到的结果用perl输出。……


[Copy to clipboard] [ - ]
CODE:
open(FILE,"test") or die;
binmode(FILE);
my $len=(stat(FILE))[7];
seek(FILE,$len-1024,0);
read(FILE,$data,1024);
close FILE;
print $data;

呵呵,用这个吧,处理下$data就可以了,够快。


QUOTE:
原帖由 y6cmE 于 2009-1-4 17:42 发表

open(FILE,"test") or die;
binmode(FILE);
my $len=(stat(FILE))[7];
seek(FILE,$len-1024,0);
read(FILE,$data,1024);
close FILE;
print $data;

呵呵,用这个吧,处理下$data就可以了,够快。

这个如何知道是文件的最后20行?


QUOTE:
原帖由 lonelyair 于 2009-1-4 17:56 发表




这个如何知道是文件的最后20行?

判断\n个数吧。1024不一定合适。
多谢各位大侠指教,哈哈,学习了。


QUOTE:
原帖由 ynchnluiti 于 2009-1-4 17:59 发表

判断\n个数吧。1024不一定合适。

今天看文档(perldata)学到一招

[Copy to clipboard] [ - ]
CODE:
my $cnt = () = $str =~ m/\n/sg;

最后 $cnt 就是 $str 中包含的 \n 的个数。当然,这么写是由于 Perl 没有和 scalar 对应的 operator 可以提供 list context,如果有的话,例如叫 list,那么就可以写

[Copy to clipboard] [ - ]
CODE:
my $cnt = list($str =~ m/\n/sg);