Я пытаюсь прочитать данные unbufferd из трубы в Perl. Например, в программе ниже:Чтение небуферизованных данных из трубы в Perl
open FILE,"-|","iostat -dx 10 5";
$old=select FILE;
$|=1;
select $old;
$|=1;
foreach $i (<FILE>) {
print "GOT: $i\n";
}
iostat выплескивает данные каждые 10 секунд (пять раз). Вы ожидали бы, что эта программа будет делать то же самое. Однако вместо этого он, кажется, виснет в течение 50 секунд (т. Е. 10x5), после чего он выплескивает все данные.
Как я могу получить, чтобы вернуть все доступные данные (небуферизованным образом), не дожидаясь завершения EOF?
P.S. Я видел многочисленные ссылки на это под Windows - я делаю это под Linux.
Вы должны использовать 'while' не' foreach'. И ваша буферизация вывода несущественна, учитывая, что это ручка ввода, а не выходной дескриптор. – tchrist
В чем разница при использовании while и foreach? – Jean
@alertjean: В 'foreach my $ i () {...}' чтение файла выполняется в контексте списка, то есть весь файл считывается до того, как строки обрабатываются в цикле 'foreach'. В 'while (my $ i = ) {...}' чтение выполняется в скалярном контексте, то есть каждая строка считывается, а затем обрабатывается в блоке while до того, как будет прочитана следующая строка. –