вывод $ cmd в файл - PullRequest
       4

вывод $ cmd в файл

2 голосов
/ 04 августа 2010

У меня есть этот код ниже:

$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?

Ответы [ 4 ]

2 голосов
/ 04 августа 2010

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

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

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

while (<$p4>) {
  print OUTPUT lc($_);  # no shouting please!
}
2 голосов
/ 04 августа 2010

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

my @lines = qx(p4 change -o 3456789);
1 голос
/ 04 августа 2010

Если вас смущает запоминание того, что нужно запустить, чтобы получить возвращаемое значение команды по сравнению с ее выводом, или как обрабатывать разные коды возврата, или забыли сдвинуть полученный код вправо, вам нужно 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);
1 голос
/ 04 августа 2010

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

1) dup system STDOUT дескриптор файла, 2) open STDOUT, 3) system, 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...