2015-02-11 58 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(); 
} 

這是一些非常簡單的例子代碼 - 您可以通過多種方式擴展它,但原理是這樣的:

  • 你啓動一個線程來「做這項工作'。
  • 你在'主'線程中處理'按鍵觀看'。

因爲這裏有睡眠,所以你並不忙 - 等待按鍵(例如輪詢與處理器旋轉一樣快)。