2014-08-12 4 views
0

Я сделал простой исполняемый файл (string.exe) из следующего кода. Вы не можете изменить этот файл.Как получить строку командной строки Windows?

$| = 1; 
foreach my $i (1..10) { 
    print "test : $i\r"; 
    sleep 2; 
} 

Я хочу получить выход из этой программы в режиме реального времени. Я попытался сделать это со следующим кодом:

open(my $fh, '-|', 'string.exe') or die $!; 
while (my $line = <$fh>) { 
    print $line; 
} 

Но я не могу получить вывод в режиме реального времени. На мой взгляд, это связано с использованием возврата каретки (\r).

+0

Я что-то проверю ... – user3934476

ответ

0

Как получить строку командной строки Windows?

Если я правильно понял ваш вопрос, вы можете использовать что-то вроде

local $cmd = join " ", $0, @ARGV; 
print $cmd; 
2

Вы можете настроить свой $INPUT_RECORD_SEPARATOR в \r:

local $/ = "\r"; 
while (my $line = <$fh>) { 
+0

Спасибо. Но это не работает. – user3934476

+0

Да, это работает. Не забудьте также очистить свой вывод в этой программе. – ikegami

3

readline (<>) читает, пока линия подачи не встречается , но вместо этого вы отправляете возврат каретки. readline несколько конфигурируется (через $/), но не до такой степени, что вы можете дать ему указание читать, пока не будет возвращен CR или LF.

sysread, otoh, возвращается, как только данные доступны. Это именно то, что вы хотите.

$| = 1; 
while (sysread($fh, my $buf, 64*1024)) { 
    print $buf; 
} 
+0

Спасибо. Я могу это сделать ^^ – user3934476

0

ответ Тестирование choroba «s о $INPUT_RECORD_SEPARATOR:

use strict; 
use warnings; 

# As described in http://perldoc.perl.org/perlipc.html#Safe-Pipe-Opens 
my $pid = open(KID_TO_READ, "-|") // die "can't fork: $!"; 

# Parent 
if ($pid) { 
    local $/ = "\r"; 
    while (<KID_TO_READ>) { 
     use Data::Dump; 
     dd $_; 
    } 
    close(KID_TO_READ) or warn "kid exited $?"; 

# Child 
} else { 
    local $| = 1; 
    foreach my $i (1..10) { 
     print "test : $i\r"; 
     sleep 2; 
    } 
    exit; 
} 

Выходы:

"test : 1\r" 
"test : 2\r" 
"test : 3\r" 
"test : 4\r" 
"test : 5\r" 
"test : 6\r" 
"test : 7\r" 
"test : 8\r" 
"test : 9\r" 
"test : 10\r" 

Как ни странно, этот тест не будет работать на Windows:

'-' is not recognized as an internal or external command, 
operable program or batch file. 
kid exited 256 at test_RS.pl line 14. 

Однако это все еще подтверждает, что $RS будет работать как задокументировано.

Смежные вопросы