我正在尝试使用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(我使用的)上不起作用,但我不认为这个功能就是其中之一。如果这不能工作,有没有更好的选择仍然很容易使用?
答案 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"'