2009-04-17 3 views
7

Если у меня есть это приложение PERL:Как очистить вывод в backticks В Perl?

print `someshellscript.sh`; 

, который печатает кучу вещей и занимает много времени, чтобы закончить, как я могу напечатать, что выход в середине выполнения скрипта?

Похоже, что Perl распечатает только результат someshellscript.sh, когда он будет завершен, есть ли способ сделать выходной поток в середине выполнения?

ответ

16

То, что вы, вероятно, хотите сделать что-то вроде этого:

open(F, "someshellscript.sh|"); 
while (<F>) { 
    print; 
} 
close(F); 

Выполняется someshellscript.sh и открывает трубу, которая считывает ее выход. Цикл while считывает каждую строку вывода, сгенерированную скриптом, и печатает его. Дополнительную информацию см. На странице документации open.

+4

Единственное, что я хотел бы добавить, это то, что обычно лучше использовать лексическую дескриптор файла: откройте мой $ fh, "someshellscript.sh |" или умереть $ !; – friedo

+0

Почему это лучше? –

+3

@Nathan: (1) Вы не можете случайно замаскировать существующий дескриптор файла в сдерживаемой области; (2) Лексический дескриптор файла будет автоматически закрыт, когда исчезнут все ссылки на дескриптор файла (обычно при выходе из области). –

3

Проблема заключается в том, что экранирование с backticks сохраняет ваш скрипт в строку, которую вы затем печатаете. По этой причине не было бы способа «промыть» печать.

Используя систему команд() следует печатать вывод непрерывно, но вы не будете иметь возможность перехватывать вывод:

system "someshellscript.sh"; 
+0

+1. EDIT: я добавил быструю демонстрацию system() и удалил свой собственный ответ, который в противном случае был бы лишним. –