Почему я теряю вывод при вызове другой 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. Спасибо Крису Тернеру.