如何判断Perl中的文件句柄是否为空?

时间:2010-05-10 11:38:22

标签: perl filehandle

例如:

open (PS , " tail -n 1 $file | grep win " );

我想查找文件句柄是否为空。

4 个答案:

答案 0 :(得分:5)

您还可以使用eof检查文件句柄是否已用尽。这是一个基于您的代码的插图。另请注意使用带有3-arg形式open的词法文件句柄。

use strict;
use warnings;

my ($file_name, $find, $n) = @ARGV;

open my $fh, '-|', "tail -n $n $file_name | grep $find" or die $!;

if (eof $fh){
    print "No lines\n";
}
else {
    print <$fh>;
}

答案 1 :(得分:3)

虽然在尝试读取eof之前调用chomp(my $gotwin = `tail -n 1 $file | grep win`); 会产生您希望在此特定情况下的结果,但请注意perlfunc documentation on eof末尾的建议:

  

实用提示:您几乎不需要在Perl中使用eof,因为输入操作符通常会在数据耗尽时返回undef,或者出现错误。

你的命令最多会产生一行,所以把它贴在标量中,例如

grep

请注意tail的退出状态会告诉您模式是否匹配:

  

2.3退出状态

     

通常情况下,如果找到选定的行,则退出状态为0,否则为1

此外,#! /usr/bin/perl use strict; use warnings; my $file = "input.dat"; chomp(my $gotwin = `tail -n 1 $file | grep win`); my $status = $? >> 8; if ($status == 1) { print "$0: no match [$gotwin]\n"; } elsif ($status == 0) { print "$0: hit! [$gotwin]\n"; } else { die "$0: command pipeline exited $status"; } 成功时退出0或失败时退出非零。使用这些信息对您有利:

{{1}}

例如:

$ > input.dat 
$ ./prog.pl 
./prog.pl: no match []
$ echo win >input.dat
$ ./prog.pl 
./prog.pl: hit! [win]
$ rm input.dat 
$ ./prog.pl 
tail: cannot open `input.dat' for reading: No such file or directory
./prog.pl: no match []

答案 2 :(得分:1)

open (PS,"tail -n 1 $file|");
if($l=<PS>)
  {print"$l"}
else
  {print"$file is empty\n"}

答案 3 :(得分:-1)

好吧......抓住这个...我没有关于文件句柄实际上是管道输出的连接。

您应该使用stat来确定文件的大小,但您需要这样做 确保首先刷新文件:

#!/usr/bin/perl

my $fh;
open $fh, ">", "foo.txt" or die "cannot open foo.txt - $!\n";

my $size = (stat $fh)[7];
print "size of file is $size\n";

print $fh "Foo";

$size = (stat $fh)[7];
print "size of file is $size\n";

$fh->flush;

$size = (stat $fh)[7];
print "size of file is $size\n";

close $fh;