Perl скрипт продолжает читать данные из STDIN - PullRequest
1 голос
/ 27 декабря 2010

У меня есть 2 сценария для задачи.

1-й выводит строки данных (заканчиваются RT / LF) в STDOUT время от времени.

2-й продолжает чтение данных из STDIN длядальнейшая обработка следующим образом:

use strict; 
my $dataline; 
while(1) { 
    $dtaline = ""; 
    $dataline = <STDIN>; 
    until( $dataline ne "") { 
        sleep(1); 
        $dataline = <STDIN>; 
    }

    #further processing with a non-empty data line follows   
} 

print "quitting...\n";

Я перенаправляю вывод с 1-го на 2-й, используя трубу следующим образом: perl scrt1 | perl scpt2.

Но проблема у меня возниклас этими 2 сценариями выглядит так, что 2-й сценарий продолжает получать начальную загрузку строк данных из 1-го сценария, если после первоначальной загрузки больше нет данных.

Интересно, может ли кто-нибудь, имеющий подобные события, любезнонемного помочь?

Спасибо.

1 Ответ

4 голосов
/ 27 декабря 2010

Вы, кажется, делаете это намного сложнее, чем нужно. Perl обычно использует блокирующий ввод / вывод, что означает, что <STDIN> не вернется, пока не будет завершена строка ввода.

use strict; 
use warnings; # use this too

while (my $dataline = <STDIN>) {
  #further processing with a non-empty data line follows   
}

print "quitting...\n";

Когда больше нет ввода (в вашем примере, когда scrt1 выходит), <STDIN> возвращает undef, что завершит цикл while. (Perl добавляет неявный defined тест к while ($var = <>) циклам.)

...