2010-08-04 4 views
2

Я это ниже кода:

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

Я хочу напечатать выходное -описание списка изменений - в файл.

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

будет записывать вывод в файл output_cl.txt.

Но, все равно, чтобы получить выход через $cmd?

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

напишет 0 или 1 в файл. Как получить результат от $cmd?

+2

Ваш вопрос сбивает с толку. Вам нужен вывод исходной команды 'p4 change -o 3456789' или вам нужно что-то еще? Если вы хотите получить исходную команду, не используйте 'system'. Вместо этого используйте обратные ссылки. – sholsapp

ответ

2

Чтобы сохранить вывод команды p4 в массив, используйте qx:

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

Вы всегда можете использовать следующий процесс, чтобы сбросить выход прямо в файл.

1) DUP дескриптор файла системы STDOUT, 2) open STDOUT, 3) система, 4) скопировать слот ввода-вывода обратно в 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 

Но qx//, вероятно, что вы ищете ,

ссылка: perlopentut


Конечно, это может быть обобщена:

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

Если вам запутанным вспомнить, что вам нужно запустить, чтобы получить возвращаемое значение комманд, vs. его выход, или как обрабатывать разные коды возврата, или забыть сменить сдвиг полученного кода, вам нужно IPC::System::Simple, что делает все это, ну, просто:

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

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

В дополнение к захвату всего вывода команды с помощью qx// or backticks вы можете получить дескриптор вывода команды. Например

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

Теперь вы можете прочитать $p4 линия в то время, и, возможно, манипулировать ею как в

while (<$p4>) { 
    print OUTPUT lc($_); # no shouting please! 
} 
Смежные вопросы