0

我正在尝试以下操作:

我想分叉多个进程并同时使用多个管道(子 -> 父)。我的方法是使用 IO::Pipe。

#!/usr/bin/perl
use strict;
use IO::Pipe;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my @ua_processes = (0..9);
my $url = "http://<some-sample-textfile>";
my @ua_pipe;
my @ua_process;

$ua_pipe[0] = IO::Pipe->new();

$ua_process[0] = fork();
if( $ua_process[0] == 0 ) {
    my $response = $ua->get($url);
    $ua_pipe[0]->writer();
    print $ua_pipe[0] $response->decoded_content;
    exit 0;
}

$ua_pipe[0]->reader();
while (<$ua_pipe[0]>) {
    print $_;
}

将来我想在一个数组中使用多个“$ua_process”。

执行后出现以下错误:

Scalar found where operator expected at ./forked.pl line 18, near "] $response"
        (Missing operator before  $response?)
syntax error at ./forked.pl line 18, near "] $response"
BEGIN not safe after errors--compilation aborted at ./forked.pl line 23.

如果我不使用数组,相同的代码可以完美运行。似乎只有 $ua_pipe[0] 没有按预期工作(与数组一起)。

我真的不知道为什么。有人知道解决方案吗?帮助将不胜感激!

4

1 回答 1

4

你的问题在这里:

print $ua_pipe[0] $response->decoded_content;

和内置函数使用间接语法print来指定文件句柄。这仅允许单个标量变量或裸字:say

print STDOUT "foo";

或者

print $file "foo";

如果要通过更复杂的表达式指定文件句柄,则必须将该表达式括在花括号中;这被称为与格块

print { $ua_pipe[0] } $response-decoded_content;

现在应该可以正常工作了。


编辑

我忽略了<$ua_pipe[0]>. readline 操作符<>也兼作glob操作符(即,对类似 的模式进行 shell 扩展*.txt)。say在这里,与 for和apply相同的规则print:如果它是一个裸字或简单的标量变量,它只会使用文件句柄。否则,它将被解释为 glob 模式(暗示参数的字符串化)。消除歧义:

  • 对于 readline <>,我们必须求助于readline内置:

    while (readline $ua_pipe[0]) { ... }
    
  • 要强制 globbing <>,请传递一个字符串:<"some*.pattern">,或者最好使用glob内置函数。

于 2013-06-27T19:44:12.343 回答