2010-08-04 14 views
2

J'ai ce ci-dessous le code:

$cmd = system ("p4 change -o 3456789"); 

Je veux imprimer la -description de sortie de la liste des modifications - dans un fichier.

$cmd = system ("p4 change -o 3456789 > output_cl.txt"); 

écriront la sortie pour le fichier output_cl.txt.

Mais, est-il possible d'obtenir la sortie via $cmd?

open(OUTPUT, ">$output_cl.txt") || die "Wrong Filename"; 
print OUTPUT ("$cmd"); 

écrit 0 ou 1 dans le fichier. Comment obtenir la sortie de $cmd?

+2

Votre question est source de confusion. Voulez-vous la sortie de la commande d'origine 'p4 changer -o 3456789' ou voulez-vous quelque chose d'autre? Si vous voulez la sortie de la commande d'origine, n'utilisez pas 'system'. Au lieu de cela, utilisez des backticks. – sholsapp

Répondre

2

Pour enregistrer la sortie de votre commande p4 dans un tableau, utilisez qx:

my @lines = qx(p4 change -o 3456789); 
1

Vous pouvez toujours utiliser le processus suivant pour vider directement dans un fichier de sortie.

1) dup le descripteur de fichier système STDOUT, 2) open STDOUT, 3) système, 4) copier la fente IO retour dans STDOUT:

open(my $save_stdout, '>&1');    # dup the file 
open(STDOUT, '>', '/path/to/output/glop'); # open STDOUT 
system(qw<cmd.exe /C dir>);    # system (on windows) 
*::STDOUT = $save_stdout;     # overwrite STDOUT{IO} 
print "Back to STDOUT!";      # this should show up in output 

Mais qx// est probablement ce que vous cherchez .

Référence: perlopentut


Bien sûr, cela pourrait être généralisé:

sub command_to_file { 
    my $arg = shift; 
    my ($command, $rdir, $file) = $arg =~ /(.*?)\s*(>{1,2})\s*([^>]+)$/; 
    unless ($command) { 
     $command = $arg; 
     $arg  = shift; 
     ($rdir, $file) = $arg =~ /\s*(>{1,2})\s*([^>]*)$/; 
     if (!$rdir) { 
      ($rdir, $file) = ('>', $arg); 
     } 
     elsif (!$file) { 
      $file = shift; 
     } 
    } 
    open(my $save_stdout, '>&1'); 
    open(STDOUT, $rdir, $file); 
    print $command, "\n\n"; 
    system(split /\s+/, $command); 
    *::STDOUT = $save_stdout; 
    return; 
} 
1

Si vous trouvez confus rappelant ce que vous devez exécuter afin d'obtenir la valeur de retour d'une commande, par rapport à sa sortie, ou comment gérer différents codes de retour, ou oublier de déplacer à droite le code résultant, vous avez besoin IPC::System::Simple, ce qui rend tout cela, bien, simple:

use IPC::System::Simple qw(system systemx capture capturex); 

my $change_num = 3456789; 
my $output = capture(qw(p4 change -o), $change_num); 
2

En plus de saisir toute la sortie d'une commande avec qx// or backticks, vous pouvez obtenir un handle sur la sortie d'une commande. Par exemple

open my $p4, "-|", "p4 change -o 3456789" 
    or die "$0: open p4: $!"; 

Maintenant, vous pouvez lire $p4 une ligne à la fois et peut-être manipuler comme dans

while (<$p4>) { 
    print OUTPUT lc($_); # no shouting please! 
}