2010-06-10 52 views
0

最终,我想要做的是在模块中启动进程并在另一个脚本中实时解析输出。Perl - 如何使用在另一个Perl脚本中的模块中创建的句柄

我想要做什么:

  • 打开进程处理程序(IPC)
  • 使用 模块之外这个属性

如何我试图做到这一点,失败:

  • 打开进程处理程序
  • 将处理程序保存在模块的 属性中
  • 使用模块外部的属性。

代码示例:

#module.pm 

$self->{PROCESS_HANDLER}; 

sub doSomething{ 
    ... 
    open($self->{PROCESS_HANDLER}, "run a .jar 2>&1 |"); 
    ... 
} 


#perlScript.pl 

my $module = new module(...); 
... 
$module->doSomething(); 
... 
while($module->{PROCESS_HANDLER}){ 
    ... 
} 
+0

什么'自我 - > {PROCESS_HANDLER}'平均(不带前导'$')? – mob 2010-06-10 15:47:46

+0

我的错误,我已经更新了。 – Zwik 2010-06-10 16:58:58

回答

2

while声明缺少readline迭代器,一两件事:

while(< {$module->{PROCESS_HANDLER}} >) { ... 

while(readline($module->{PROCESS_HANDLER})) { ... 
+0

< {$module-> {PROCESS_HANDLER}}>没有工作,但是readline($ module - > {PROCESS_HANDLER})做到了。非常感谢你。 – Zwik 2010-06-10 17:20:49

+0

my $ handle = $ module - > {PROCESS_HANDLER};而(<$handle>)...会工作。 – runrig 2010-06-10 20:56:39

3

package Thing; 
use Moose; 
use IO::Pipe; 

has 'foo' => (
    is  => 'ro', 
    isa  => 'IO::Handle', 
    default => sub { 
     my $handle = IO::Pipe->new; 
     $handle->reader('run a .jar 2>&1'); # note, *no* pipe character here 
     return $handle; 
    }); 

1; 

package main; 
use Thing; 
my $t = Thing->new; 
say $t->foo->getlines; 
+0

getlines将返回什么?我的意思是,自从我上次调用该方法以来它会返回输出吗? – Zwik 2010-06-10 15:46:47

+0

[是](http://p3rl.org/IO::Handle#%24io-%3Egetlines)。 – daxim 2010-06-10 15:56:45

+0

谢谢你的回答,但由于我没有使用穆斯,这不是我正在寻找的。 – Zwik 2010-06-10 17:20:16

相关问题