2014-02-26 40 views
2

我正在编写一个Perl脚本,要求输入一些内容,然后最终运行另一个脚本将这些输入作为参数传递。我打电话的那个脚本有print输出,它指定在经过foreach循环时完成了多少处理的百分比。Perl - 调用其他脚本并在运行时显示输出

目前,我打电话给其他Perl脚本是这样的:

print `perl /path/to/script.pl -x 0990;` 

这工作得很好,但是当调用脚本结束时只打印任何输出......因此,例如,当该脚本完成时,我得到的输出是:

Status: 100% Completed 
    Done! 

当我想获得每个%数的输出。

任何可能的解决方案?

谢谢!

回答

1

我希望这对你的作品:

#!/usr/bin/perl 
use POSIX ":sys_wait_h"; 
use IPC::Open3; 
use IO::Select; 

# forces a flush to stdout 
$| = 1; 

# open a process for writing, reading, and error 
my $pid = open3(0,\*READ,0,"perl /path/to/script.pl -x 0990"); 

# reading process output in non-blocking mode 
my $sel = new IO::Select(); 
$sel->add(\*READ); 

# read process output until process returns 
do { 
foreach my $h ($sel->can_read) 
{ 
    my $buf = ''; 
    sysread(READ,$buf,4096); 
    if($buf){print "response->$buf"} 
} 
$kid = waitpid(-1, WNOHANG); 
} while $kid > -1; 

编辑:

此脚本未在Windows平台上工作

+0

不为我工作。我正在研究一个解决方案,但是你首先发布了你的(而且我的工作不行!),所以我尝试了你的。 DO循环运行的子脚本运行的确切时间长度,但FOREACH循环从不输入。 – jimtut

+0

@jimtut工作在这里。这可能是因为你的进程没有任何输出,所以'$ sel-> can_read'块永远不会执行。 –

+0

在我的结尾工作。但是,它只会在被调用的脚本中执行print内部的foreach循环。在该脚本中有几个打印输出没有在过程中显示......任何想法为什么会表现得如此?该片段只是在foreach内查找输出吗? – jScott

相关问题