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 脚本的执行,然后实际执行它们?

如何将 shell 脚本翻译成 Perl?

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

如何在 localhost 中运行 perl 脚本?