IPC :: Open2和Term :: ReadKey可以一起使用吗?

时间:2014-08-17 02:24:23

标签: perl

我正在尝试使用Perl来运行/与其他程序通信。虽然我已经能够使用Open2接收来自另一个程序的输出(并向其发送输入),但我想要一种方法一次从一个字符接收程序的输出。

这是一个代码片段,它接收来自另一个程序的输出:

use strict;
use IPC::Open2;

my $pid = open2(my $read, my $write, "python test2.txt");
print $write "various words\n";
my $answer = <$read>;
print $answer;

这是一个示例代码片段,用于监听(但不等待)输入,在按下按钮之前,它会执行其他操作。

use strict;
use Term::ReadKey;

my $char = '';
my $hesitation = 0;
while($char eq ''){
 print "$hesitation\n";
 $hesitation++;  #other things here
 $char = ReadKey(-1);
}
print "You pressed the $char key!";

虽然这些只是示例,但我想要一种方法来结合这种行为。我试图将它们组合起来:

use strict;
use Term::ReadKey;
use IPC::Open2;

my $pid = open2(my $read, my $write, "python test2.txt");
print $write "various words\n";
my $char = '';
my $hesitation = 0;
while($char eq ''){
 print "$hesitation\n";
 $hesitation++;
 $char = ReadKey(-1,$read);
}
print "You pressed the $char key!";

问题是ReadKey(-1,$read)似乎从STDIN接收输入而不是test2.py的输出。我不确定为什么会这样。据我所知,没有错误被抛出。

我已经看到ReadKey的几个功能在Windows(我使用的)上不起作用,但我不认为这个功能就是其中之一。如果这不能工作,有没有更好的选择仍然很容易使用?

1 个答案:

答案 0 :(得分:0)

Term :: ReadKey与 term inal进行交互。

听起来你正在寻找一种无阻塞的阅读。

use IO::Handle qw( );        # Not needed on new versions of Perl.
use IPC::Open2 qw( open2 );

my $pid = open2(
   local *FR_CHILD,
   local *TO_CHILD,
   'perl', '-e', 'sleep 1; print qq{a\n}',
);

FR_CHILD->blocking(0);

print TO_CHILD "various words\n";

my ($char, $hesitation);
while (!defined($char = getc(FR_CHILD))) {
   print "$hesitation\n";
   ++$hesitation;
}

print "Read \"$char\"\n";

close(TO_CHILD);
waitpid($pid, 0);

输出:

...
15485
15486
15487
15488
15489
15490
Read "a"

->blocking(0)在Windows上对我不起作用,我必须使用'perl -e"sleep 1; print "a\n"'