Все задачи

Что-что вы сказали?

22 Aug 2013

Программист решил сделать собственную обертку над оператором ``. Функция exec_and_get_output должна запускать внешнюю программу (если программу запустить не удалось, делать die) и возвращать ее вывод как массив строк.

# выполняет внешнюю программу, возвращает ее stdout в виде массива строк
# если программу не удалось выполнить или она закончилась ошибкой -- умирает
sub exec_and_get_output 
{
   my @cmd  = @_;
   my @answer  = `@cmd` or die "Can't exec[@cmd]: $?";
   return @answer;
}

Пример кода можно скачать.

Однако функция умирала гораздо чаще, чем предполагал программист. Например, при выполнении безобидных поисков пакетов с помощью apt-cache search.

Подсказка

Показать

Например, при поиске несуществующих пакетов. Или когда find ничего не находит.

Подсказка-2

Показать

То есть всегда, когда внешняя программа ничего не выводит.

Разоблачение

Показать

Результат выполнения оператора обратных кавычек `` – вывод вызванной внешней программы. Если программа ничего не печатала, то результат будет пустой строкой, то есть ложным значением, и сработает die.

Поэтому exec_and_get_output выполняет die всякий раз, когда не получает никакого вывода от внешней программы. Однако отсутствие вывода не обязательно означает ошибку. Во всяком случае, пустой вывод следовало бы обрабатывать снаружи exec_and_get_output в соответствии с логикой вызывающего кода.