ho appena iniziato a usare Perl qui. In precedenza ho usato con successo i backtick per acquisire l'output dei comandi di sistema in Perl, come ad esempio:
my @sysOut = `cleartool checkout -nc "$file"`; # works fine!
ma ho riscontrato qualche problema e anche dopo essermi guardato in giro per un po 'non ho trovato la soluzione a questo problema. Sto provando a scrivere uno script Perl per controllare un elenco di file estratti (@allfiles)
usando cleartool, tranne se ce ne sono identici al loro predecessore, quindi deselezionarli.
Il modo in cui sto rilevando (... fallendo!) Se sono identici o no è quello di ottenere l'output dal tentativo di check in, vedere se corrisponde /error.*identical/i
e, in tal caso, deseleziona il file. Tuttavia, per qualche motivo l'output sembra bypassare l'array in cui lo sto passando.
Vedi il codice che genera questo problema:
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"";
}
}
}
Ecco l'output della mia riga di comando (come se avessi appena usato una chiamata di sistema):
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.
SOLUZIONE: controlla anche il flusso di errori std quando afferri l'output (a posteriori questo ha senso mentre stavo cercando di analizzare i messaggi di errore ... oh bene)
my @checkInErr = `cleartool checkin -nc "$file" 2>&1`;
risposte:
1 per risposta № 1È possibile che l'output dell'errore da cleartool non venga visualizzato sull'output standard (stdout). Con un po 'di fortuna, viene visualizzato sull'errore standard (stderr). In tal caso, dovrebbe funzionare:
system "cleartool uncheckout -rm -cact "$file" 2>&1";