Утечка вывода системной команды — perl

#perl #command #system #output

#perl #команда #система #вывод

Вопрос:

только начинаю использовать Perl здесь. Ранее я успешно использовал обратные ссылки для захвата вывода системных команд в Perl, например:

 my @sysOut = `cleartool checkout -nc "$file"`; # works fine!
  

но я столкнулся с некоторыми проблемами, и даже после некоторого времени поиска я не нашел решения этой проблемы. Я пытаюсь написать сценарий Perl для проверки списка извлеченных файлов (@allfiles) с помощью cleartool, за исключением случаев, когда какие-либо из них идентичны их предшественнику, затем отмените их проверку.

Способ, которым я (… не удается!) определяю, идентичны они или нет, состоит в том, чтобы получить вывод при попытке проверки, посмотреть, совпадает ли он /error.*identical/i , а затем, если да, снимите флажок с файла. Однако по какой-то причине вывод, похоже, обходит массив, в который я его передаю.
Смотрите Код, который порождает эту проблему:

 foreach my $file (@allfiles){ 
    chomp( my @checkInErr = `cleartool checkin -nc "$file"`);
    foreach my $err (@checkInErr) { # if no error, checkin done
        if ($err =~ m/error.*identical/i) {  # if there is error:
            print $err; 
            print "No change detected: unchecking out.n"; # uncheckout same version
            system "cleartool uncheckout -rm -cact "$file""; 
        }
    } 
}
  

Вот мой вывод командной строки (как если бы я только что использовал вызов system ())):

 cleartool: Error: Unable to check in "a5TI.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6cm.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6FT.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6pm.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
cleartool: Error: Unable to check in "a6TI.txt".
cleartool: Error: By default, won't create version with data identical to predecessor.
  

РЕШЕНИЕ: также проверяйте поток ошибок std при получении выходных данных (в ретроспективе это имеет смысл, поскольку я пытался проанализировать сообщения об ошибках… ну что ж)

 my @checkInErr = `cleartool checkin -nc "$file" 2>amp;1`;
  

Ответ №1:

Возможно, вывод ошибки из cleartool не выводится на стандартный вывод (стандартный вывод). Если повезет, это выдает стандартную ошибку (stderr). Если это так, это должно сработать:

 system "cleartool uncheckout -rm -cact "$file" 2>amp;1";
  

Комментарии:

1. Да, я думаю, что это было именно так! добавление stderr делает его анализ корректным, поэтому он, должно быть, шел туда. Идеальный