Perl - 如何在另一个 Perl 脚本中使用在模块中创建的进程句柄

发布于 2024-09-05 07:10:16 字数 528 浏览 6 评论 0原文

最终,我想做的是在模块中启动一个进程,并在另一个脚本中实时解析输出。

我想要做什么:

  • 打开一个进程处理程序(IPC)
  • 在外部使用此属性 模块

我尝试执行此操作并失败:

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

代码示例:

#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} ){
  ...
}

Ultimately, what I want to do is to start a process in a module and parse the output in real time in another script.

What I want to do :

  • Open a process Handler (IPC)
  • Use this attribute outside of the
    Module

How I'm trying to do it and fail :

  • Open the process handler
  • Save the handler in a module's
    attribute
  • Use the attribute outside the module.

Code example :

#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} ){
  ...
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉宸 2024-09-12 07:10:16
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;
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;
那支青花 2024-09-12 07:10:16

一方面,您的 while 语句缺少 readline 迭代器:

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

或者

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

Your while statement is missing a readline iterator, for one thing:

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

or

while( readline($module->{PROCESS_HANDLER}) ) { ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文