Вызовите системную команду из сценария perl, распечатав вывод и сохранив его в переменной - PullRequest
0 голосов
/ 17 октября 2018

Я хочу отправить команду, например, выполнить пинг:

ping google.es -n 500

Я могу выполнить команду с:

my $command =  "ping google.es -n 500";
system($command);

И я получу вывод на печать, покаон запускается.

Я могу сохранить его в переменной с помощью:

my $command =  "ping google.es -n 500";
my $output = `$command`;

Но как я могу получить выходные данные команды WHILE , которая выполняется, и затем использоватьвывод в переменную?

Я вижу подобное решение, но оно не работает.Он запускает скрипт и после его завершения выводит результат:

my $variable = '';
open my $command_pipe, "-|", $command or die "Pipe from $command failed: $!";
while (<$command_pipe>) {
    print  $_;
    $variable . = $_;
}

UPDATE : пример, чтобы показать проблему.У меня есть 2 сценария Perl, и один вызывает другой:

test.pl:

use strict;
use warnings;

my $command = 'perl test2.pl';

print "Localtime: " . localtime() . "\n";

my $variable = '';
open my $command_pipe, "-|", $command or die "Pipe from $command failed: $!";
while (<$command_pipe>) {
    print "[" .  localtime() . "] " . $_;
    $variable .= $_;
}

print "Localtime: " . localtime() . "\n";
print "Loop finished:\n$variable\n";

Второй файл test2.pl:

use strict;
use warnings;


print "Waiting 10 sec\n";
my $i = 0;
while($i < 10){
    sleep(1);
    print "$i\n";
    $i++;
}
print "That's it!\n";

И вывод:

C:\Users\****\Desktop\****>perl test.pl
Localtime: Wed Oct 17 13:47:06 2018
[Wed Oct 17 13:47:16 2018] Waiting 10 sec
[Wed Oct 17 13:47:16 2018] 0
[Wed Oct 17 13:47:16 2018] 1
[Wed Oct 17 13:47:16 2018] 2
[Wed Oct 17 13:47:16 2018] 3
[Wed Oct 17 13:47:16 2018] 4
[Wed Oct 17 13:47:16 2018] 5
[Wed Oct 17 13:47:16 2018] 6
[Wed Oct 17 13:47:16 2018] 7
[Wed Oct 17 13:47:16 2018] 8
[Wed Oct 17 13:47:16 2018] 9
[Wed Oct 17 13:47:16 2018] That's it!
Localtime: Wed Oct 17 13:47:16 2018
Loop finished:
Waiting 10 sec
0
1
2
3
4
5
6
7
8
9
That's it!

Как видите, все напечатано только через 10 секунд второго сценария.

1 Ответ

0 голосов
/ 17 октября 2018

Этот код работает для меня точно так, как ожидалось (я немного изменил синтаксис вашего ping вызова).

#!/usr/bin/perl

use strict;
use warnings;

my $command = 'ping -c 5 google.es';

my $variable;
open my $command_pipe, "-|", $command or die "Pipe from $command failed: $!";
while (<$command_pipe>) {
    print  $_;
    $variable .= $_;
}

print "Loop finished:\n$variable\n";

Если он не работает для вас, вы можете страдать от буферизации.Или вы можете дать нам полную автономную программу, которая демонстрирует вашу проблему?

Обновление: Как я уже говорил выше, вы страдаете от буферизации.Вы читали статью, на которую я ссылался?Все, что вам нужно сделать, это отключить буферизацию на STDOUT.

$|++;

Обновление 2: Для ясности, вам нужно поместить этот код в test2.pl - это программа, котораяделать буферизованные отпечатки, так что вам нужно отключить буферизацию.

...