/ /システムコマンド出力リーク-perl-perl、コマンド、システム、出力

システムコマンドの出力リーク - perl - perl、command、system、output

ここで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>&1`;

回答:

回答№1は1

cleartoolからのエラー出力が標準出力(stdout)で出力されない可能性があります。運が良ければ、標準エラー(stderr)で出力されます。もしそうなら、これはうまくいくはずです:

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