刚开始在这里使用Perl。我之前已成功使用反引号来捕获Perl中的系统命令输出,例如:
my @sysOut = `cleartool checkout -nc \"$file\"`; # works fine!
但是我遇到了一些麻烦,即使在看了一段时间后我也找不到解决这个问题的方法。我正在尝试使用cleartool编写一个Perl脚本来检查已检出文件(@allfiles)
的列表,除非它们与它们的前任相同,然后取消签出它们。
我的方式(...失败!)检测它们是否相同是从检入尝试中获取输出,看它是否与/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>&1`;
答案 0 :(得分:1)
可能是标准输出(标准输出)上没有出现来自cleartool的错误输出。运气好的话,它出现在标准错误(stderr)上。如果是这样,这应该有效:
system "cleartool uncheckout -rm -cact \"$file\" 2>&1";