Как я могу определить, является ли дескриптор файла пустым в Perl? - PullRequest
0 голосов
/ 10 мая 2010

Например:

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

Я хочу выяснить, является ли дескриптор файла пустым или нет.

Ответы [ 4 ]

5 голосов
/ 10 мая 2010

Вы также можете использовать eof, чтобы проверить, исчерпан ли дескриптор файла. Вот иллюстрация, основанная на вашем коде. Также обратите внимание на использование лексического дескриптора файла с 3-аргументной формой 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>;
}
3 голосов
/ 10 мая 2010

Хотя вызов eof до того, как вы попытаетесь прочитать его, даст ожидаемый вами результат в данном конкретном случае , обратите внимание на совет в конце документации perlfunc на eof

Практический совет: вам почти никогда не нужно использовать eof в Perl, потому что операторы ввода обычно возвращают undef, когда у них заканчиваются данные или если было ошибка.

Ваша команда выдаст не более одной строки, поэтому вставьте ее в скаляр, например, ,

chomp(my $gotwin = `tail -n 1 $file | grep win`);

Обратите внимание, что состояние выхода grep указывает, соответствует ли ваш шаблон:

2.3 Статус выхода

Обычно статус выхода равен 0, если найдены выбранные строки, и 1 в противном случае ...

Кроме того, tail выходит 0 в случае успеха или не ноль в случае ошибки. Используйте эту информацию в своих интересах:

#! /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";
}

Например:

$ > 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 []
1 голос
/ 10 мая 2010
open (PS,"tail -n 1 $file|");
if($l=<PS>)
  {print"$l"}
else
  {print"$file is empty\n"}
0 голосов
/ 10 мая 2010

ну ... поцарапайте это ... Я не установил связь с дескриптором файла, фактически являющимся выходом канала.

Вы должны использовать 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...