Perl IO :: Pipe在数组中不起作用

时间:2013-06-27 19:34:35

标签: arrays perl fork pipe

我尝试以下方法:

我想分叉多个进程并同时使用多个管道(child - > parent)。 我的方法是使用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]不能按预期工作(与数组一起)。

我真的不知道为什么。谁知道解决方案?非常感谢帮助!

1 个答案:

答案 0 :(得分:4)

你的问题在这里:

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

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

print STDOUT "foo";

print $file "foo";

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

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

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


修改

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

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

    while (readline $ua_pipe[0]) { ... }
    
  • 要强制全局<>,请将字符串传递给<"some*.pattern">,或者最好使用glob内置字符。