Как очистить вывод в обратных кавычках в Perl?

Если у меня есть это perl-приложение:

print `someshellscript.sh`;

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

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


person Ville M    schedule 17.04.2009    source источник


Ответы (2)


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

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

Это запускает someshellscript.sh и открывает канал, который считывает его вывод. Цикл while считывает каждую строку вывода, сгенерированную сценарием, и печатает ее. Дополнительную информацию см. на странице документации open.

person Greg Hewgill    schedule 17.04.2009
comment
Единственное, что я хотел бы добавить, это то, что обычно лучше использовать лексический дескриптор файла: open my $fh, someshellscript.sh| или умри $!; - person friedo; 17.04.2009
comment
@Nathan: (1) Вы не можете случайно удалить существующий дескриптор файла в содержащей его области; (2) Лексический дескриптор файла будет автоматически закрыт, когда все ссылки на дескриптор файла исчезнут (обычно при выходе из области видимости). - person j_random_hacker; 17.04.2009

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

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

system "someshellscript.sh";
person Stefan Kendall    schedule 17.04.2009
comment
+1. РЕДАКТИРОВАТЬ: я добавил быструю демонстрацию system() и удалил свой собственный ответ, который в остальном был излишним. - person j_random_hacker; 17.04.2009