【发布时间】:2018-01-03 21:32:45
【问题描述】:
我编写了一个 Perl 程序,它打开一个到 xargs 的管道,以便它从输入中读取并在每一行输入中运行一个命令。
我需要读取该管道的输出。
我使用open3,然后将输入写入输入文件句柄。然后循环从输出文件句柄中读取。
但是当它打印我希望看到的最后一行时,它只是挂起并且没有完成该过程。
这是脚本的摘录
my $classNamesOutput = `classNamesInArchive $opt_archive`;
my $pid = open3( \*CHILD_IN, \*CHILD_OUT, false, "xargs -n1 listJavaClassRefs -p $opt_archive -c" );
print "pid[" . $pid . "]\n";
print CHILD_IN $classNamesOutput;
my $output = '';
my $matchingArchiveNames = '';
while ( my $row = <CHILD_OUT> ) {
chomp $row;
print "row[" . $row . "]\n";
if ( $onlyListingMatches == 1 && $row eq $opt_className ) {
print $opt_archive;
last;
}
if ( $onlyListingMatches == 0 ) {
$output .= $row . "\n";
}
}
print "Past loop.\n";
它从不打印Past loop:它只是挂在我认为被调用脚本会产生的输出的最后一行。
【问题讨论】:
-
我的编辑是否正确地反映了您的问题?请不要将所有内容都个性化。
-
你从哪里得到
open3?你有use没有提到的模块吗? -
除了您询问的问题之外,您的程序还存在 shell 命令注入错误。
"xargs -n1 listJavaClassRefs -p $opt_archive -c"应该是"xargs", "-n1", "listJavaClassRefs", "-p", $opt_archive, "-c"。 -
除了您询问的问题外,您的程序还存在竞争条件。如果您想要双向通信,请避免使用
open3(因为您随后也需要开始使用 IPC::Select,这会变得非常复杂)。相反,请使用 IPC::Run3 或 IPC::Run。 -
@Borodin 我不知道您所说的“个性化”是什么意思。我从 cpan 得到了 open3。我还能从哪里得到它?
标签: perl