Хотя вызов 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 []