Perl-скрипт, вызываемый из Perl, похоже, не сбрасывает стандартный вывод - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть два сценария Perl - давайте назовем их script.pl и script2.pl.

script2.pl обновления в командной строке, как в:

print "Progress $progress percent...\r";

Чтобы заставить это работать, мне пришлось включить автозапуск при запуске script2.pl:

$|++;

Теперь проблема возникает потому, что мне нужно, чтобы script2.pl вызывался из script.pl, и это - обновление / очистка - кажется, работает только при непосредственном запуске script2.pl, а не при вызове из script.pl .

Я пробовал разные способы вызова script2.pl, от system() до бэкстиков, и ни в коем случае обновление не происходит.

Я что-то упускаю из обработки вывода stdout, когда один Perl-скрипт вызывается из другого?

1 Ответ

0 голосов
/ 30 апреля 2018

Вызов с обратными галочками вызовет новый процесс perl, и для этого процесса будет установлена ​​автоматическая очистка. Это означает, что любой вывод из script2.pl выйдет, как только будет напечатан. Конечно делать

my $output = `perl script2.pl`;

будет означать, что вы на самом деле не читаете его, пока он выводится, а скорее вы просите, чтобы весь вывод заканчивался в $output, когда он будет сделан.

$| в perl процессе, который запускается script2.pl, не имеет никакого влияния на script.pl. Если вы хотите, чтобы ваш script.pl процесс имел небуферизованный вывод, отключите там буферизацию.


Альтернативой может быть не запускать script2.pl как отдельный процесс, а реорганизовать его в модуль и правильно вызвать его, или использовать do или require для его вызова один раз. В любом случае изменение на $| произойдет в том же интерпретаторе Perl и, следовательно, будет иметь эффект.

Конечно, не очень хорошая идея, если внутренняя часть вашего приложения портится с выходной буферизацией вашего приложения. Лучшим способом было бы реорганизовать этот модуль в модуль без изменения буферизации в этом модуле, и в вашей программе, где вы его используете, установите для буферизации значение, которое вам нужно, чтобы оно было для этой конкретной программы . Всегда позволяйте потребителю решать, чего он хочет, даже если это только вы сами.

...