Perl: qx или Die

Простая задача:

У меня есть скрипт со строкой:

qx(wget -P $destination $file) || die "i can't download file: $file!\n";

но каждый раз (удалось это или нет) скрипт умирает.

Как мне изменить его на идиоматическое поведение? (успех - живи, не - умри)

Спасибо за помощь!

Некоторое издание: я хочу знать все журналы, поэтому я предпочитаю использовать такую ​​​​строку:

print qx(...)||die"EXPLAIN";


person gaussblurinc    schedule 22.11.2012    source источник


Ответы (1)


qx аналогичен использованию оператора обратных кавычек. Он возвращает вывод выполняемой программы, но только ее STDOUT, а не STDERR. wget, кажется, ничего не выводит на STDOUT (он сообщает о прогрессе в STDERR), поэтому результатом является пустая строка, которая является ложной в смысле Perl - и вызывается die.

Обычно вы оцениваете не вывод программы, чтобы определить, успешно ли она завершилась, а ее статус выхода. Это можно сделать с помощью сравнения $? с 0, так как большинство программ CLI Unix возвращают 0 в случае успеха.

Если вам вообще не нужны выходные данные wget, используйте не qx, а system< /a> вместо этого. Он напрямую возвращает код выхода программы, что позволяет вам написать die "oh noes!" if 0 != system("wget ...").

person Moritz Bunkus    schedule 22.11.2012
comment
wget -O- возвращает весь загруженный файл в стандартный вывод. - person choroba; 22.11.2012
comment
Поскольку он использует -P $destination, я сомневаюсь, что он пытается заставить wget выводить данные в STDOUT. - person Moritz Bunkus; 22.11.2012