例如:
open (PS , " tail -n 1 $file | grep win " );
我想查找文件句柄是否为空。
答案 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
末尾的建议:
你的命令最多会产生一行,所以把它贴在标量中,例如,
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;