if ((scalar @ARGV) == 0 )
{
die "Incorrect args";
}
my $pattern = shift @ARGV;
while (<>)
{
print $_ if /$pattern/;
}
perl. stdout|grep ,stdin, etc
Все знают как пользоваться grep.
I. cmd|grep word
или
II. cmd > ./file.out; grep word ./file.out
Обе команды работют одинаково, независимо от времени выполнения cmd.
Перловый скрипт
grep.pl:
@str = <>;
print make_grep(@str);
Не завершится, пока на в ходе не появиться EOF, т.е. вариант II не сработает.
Если использовать select, то скрипт получается зависимым от времени выполнения cmd.
...
select($stdin,0...,$time);
...
если $time меньше времени выполнения cmd, то grep.pl ничего не получает, а большим $time делать невыгодно.
Может кто-нибудь подскажет как сделать grep.pl похожим на grep!?
Или я что-то жутко путаю?
Спасибо.
ну навскидку так:
$echo sdf | /tmp/tmp.pl sdf
где, /tmp/tmp.pl - написаный вами код отлично работает
но..
$/tmp/tmp.pl sdf
будет ждать пока на stdin не попадет EOF или \n
В этом и был вопрос.
Как определить, что на stdin ничего нет?
Select не предлагать.
возможно что-то с трубами, но тут я теряюсь
-х
:
-u File has setuid bit set.
-g File has setgid bit set.
-k File has sticky bit set.
-t Filehandle is opened to a tty.
-T File is a text file.
-B File is a binary file (opposite of -T).
А трубы тут - полный бред.
Цитата: korisk
Спасибо, конечно, но боюсь вы не правильно меня поняли.
$echo sdf | /tmp/tmp.pl sdf
где, /tmp/tmp.pl - написаный вами код отлично работает
но..
$/tmp/tmp.pl sdf
будет ждать пока на stdin не попадет EOF или \n
$echo sdf | /tmp/tmp.pl sdf
где, /tmp/tmp.pl - написаный вами код отлично работает
но..
$/tmp/tmp.pl sdf
будет ждать пока на stdin не попадет EOF или \n
я понял вопрос так, что нужно сымитировать стандартный grep. стандартный grep раотает именно так.
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
[korisk@korsik dictionary]$
Возможно, у меня не стандартный
Цитата:
$/tmp/tmp.pl sdf
будет ждать пока на stdin не попадет EOF или \n
будет ждать пока на stdin не попадет EOF или \n
grep sdf будет делать то же самое. если мой скрипт запустить так, как это сделали вы - он тоже завершит свою работу. можете вместо die туда добавить заглушку для вывода help'a
Протру очки.
Скрипт:
#!/usr/bin/perl
my $pattern = shift @ARGV;
die "some help \n" if( -t STDIN && @ARGV==0);
while (<>)
{
print $_ if /$pattern/;
}
Работат так, как я хотел.