Почему я теряю вывод при вызове другой Perl-программы с обратными кавычками

Если я запускаю perl-программу и вызываю другую perl-программу, используя обратные кавычки, операторы print из вызываемой программы не появляются в терминале.

Если я вызываю программу, используя 'system', отображаются операторы печати.

EG: это ProgA.pl

print "In ProgA.pl, about to call ProgB.pl";
my $dum=`ProgB.pl`;                       # print output doesn't appear
### $dum=system("ProgB.pl");              # this prints OK
print"\nBack in ProgA.pl";
print "\ndum = $dum";             # ProgB's output doesn't show here either

(Предупреждений или ошибок нет, perl.exe найден через сопоставление файлов)

Это ProgB.pl:

print "\nPrinting from ProgB.pl";

В чем причина разницы?

Почему вывод вызова в кавычках не возвращается в $dum (я пробовал и STDOUT, и STDERR)? Если я вызываю dir в обратных кавычках, я получаю его вывод в $dum.

2 ответа

У вас есть проблема пути.

Работает как положено ($dum присваивается значениеPrinting from ProgB.pl") если я поменяю галочки ProgB.pl в ./ProgB.pl, Без явного ./ путь, он ищет системный путь и генерирует ошибку, как вы можете видеть, если вы измените эту строку на

my $dum=`ProgB.pl` or die $!;

Который генерирует вывод

In ProgA.pl, about to call ProgB.plNo such file or directory at ./ProgA.pl line 4.

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

Похоже, что, не поместив символ новой строки в конце команды печати в ProgB, мне не удалось очистить буфер перед возвратом в ProgA. Спасибо Крису Тернеру.

Другие вопросы по тегам