#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 делает его анализ корректным, поэтому он, должно быть, шел туда. Идеальный