Perl - 如何使用在另一个 Perl 脚本的模块中创建的进程句柄
Posted
技术标签:
【中文标题】Perl - 如何使用在另一个 Perl 脚本的模块中创建的进程句柄【英文标题】:Perl - How to use a process Handle created in a Module in another Perl Script 【发布时间】:2010-06-10 14:56:58 【问题描述】:最终,我想做的是在一个模块中启动一个进程,并在另一个脚本中实时解析输出。
我想做什么:
打开进程处理程序 (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 )
...
【问题讨论】:
self->PROCESS_HANDLER
是什么意思(没有前导$
)?
【参考方案1】:
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;
【讨论】:
getlines 究竟会返回什么?我的意思是,它会返回自上次调用该方法以来的输出吗? 感谢您的回答,但由于我没有使用 Moose,所以这不是我要搜索的内容。 我认为您将 Moose 与IO
系列模块混为一谈。 getlines
来自 IO::Handle。这个例子在没有 Moose 的情况下也可以正常工作,但是 Perl 中未加糖的 OO 代码更长,并且会混淆重要部分。【参考方案2】:
您的while
语句缺少readline
迭代器,原因之一是:
while( < $module->PROCESS_HANDLER > ) ...
或
while( readline($module->PROCESS_HANDLER) ) ...
【讨论】:
PROCESS_HANDLER > 不起作用,但 readline($module->PROCESS_HANDLER) 起作用了。非常感谢。 我的 $handle = $module->PROCESS_HANDLER; while () ... 会起作用。以上是关于Perl - 如何使用在另一个 Perl 脚本的模块中创建的进程句柄的主要内容,如果未能解决你的问题,请参考以下文章
如何检查另一个不使用 perl -c 的 perl 脚本的语法? [复制]
如何使用多个版本的 Perl 在 Perl 模块中安装脚本?
如何使用 shell 脚本拦截 perl 脚本的执行,然后实际执行它们?