2015-02-11 3 views
2
#!/usr/bin/perl -w 

use Term::ReadKey; 
ReadMode('cbreak'); 

while (1) { 
    $char = ReadKey(-1); 
    next unless defined $char; 
    printf("Char: $char Decimal: %d\tHex: %x\n", ord($char), ord($char)); 
} 
ReadMode('normal'); 

Выше работ отлично. Но я хочу, чтобы пользователь мог вводить данные во время выполнения какого-либо исполняемого файла. поэтому я попробовал ниже, но не работал. возможно, запустить исполняемый файл, пытаясь получить пользовательский ввод, испортился? если да, то как мне это сделать?Perl неблокирующий пользовательский ввод

Я получаю выход от $ myexe и в зависимости от пользовательского ввода, я хотел бы, чтобы отфильтровать вещи из различных $ myexe

#!/usr/bin/perl -w 

use Term::ReadKey; 
my $myexe = 'bin/myexecutable'; 
open my $EXE, 
    "$myexe distribute 2>&1 |" 
    or die 'Cannot open EXE'; 

ReadMode('cbreak'); 
while (<$EXE>) { 
    $char = ReadKey(-1); 
    if (defined $char) { 
     print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $char\n"; #i would press a key but nothin prints out 
    } 
    print "$_\n"; 
} 
ReadMode('normal'); 
+0

Что такое вывод 'bin/myexecutable distribute'? – rubikonx9

+0

@ g.tsh связка строк. Пример: «building » – ealeon

+0

@ g.tsh - это вывод bin/myexecutable messing со мной, способным получить пользовательский ввод? – ealeon

ответ

1

Я остерегаться работает «занят-WAIT» петли, как вы 'd получить с Term::ReadKey. Но то, что я предлагаю - если вы пытаетесь сделать сразу две вещи, - это то, что стоит подумать о том, чтобы сделать пятно параллельного кода.

Что-то вроде:

#!/usr/bin/perl 
use strict; 
use warnings; 
use threads; 
use threads::shared; 

use Term::ReadKey; 


my $myexe = 'bin/myexecutable'; 

my $filter : shared; 


sub worker { 
    open my $EXE, "$myexe distribute 2>&1 |" 
     or die 'Cannot open EXE'; 
    while (my $line = <$EXE>) { 

     #do something with filter here; 
     print "$filter : $line"; 
    } 

} 

$filter = 0; 
threads->create(\&worker); 

my $keypress; 
ReadMode 4; 

while (threads->list(threads::running)) { 
    while (not defined($keypress = ReadKey(-1)) 
     and threads->list(threads::running)) 
    { 
     print "Waiting\nRunning:" . threads->list(threads::running) . "\n"; 
     sleep 1; 
    } 
    print "Got $keypress\n"; 
    $filter = $keypress; 
} 
ReadMode 0; 

foreach my $thr (threads->list) { 
    $thr->join(); 
} 

Это некоторые довольно простой пример кода - вы можете продлить его различными способами, но принцип таков:

  • вы начинаете нить " выполнять работу'.
  • вы обрабатываете «нажатие клавиши» в основной теме.

Потому что там есть сон, вы не заняты - ожидание нажатия клавиши (например, опрос так же быстро, как процессор будет вращаться).

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