2015-02-11 54 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 2015-02-11 07:58:12

+0

@g.tsh一串字符串。例如,“building ” – ealeon 2015-02-11 08:00:13

+0

@ g.tsh是bin/myexecutable的输出与我能够获取用户输入? – ealeon 2015-02-11 08:00:46

回答

1

过滤不同的事情,我警惕运行的“忙等待”循环喜欢你的'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(); 
} 

这是一些非常简单的例子代码 - 您可以通过多种方式扩展它,但原理是这样的:

  • 你启动一个线程来“做这项工作'。
  • 你在'主'线程中处理'按键观看'。

因为这里有睡眠,所以你并不忙 - 等待按键(例如轮询与处理器旋转一样快)。