我尝试以下方法:
我想分叉多个进程并同时使用多个管道(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]不能按预期工作(与数组一起)。
我真的不知道为什么。谁知道解决方案?非常感谢帮助!
答案 0 :(得分:4)
你的问题在这里:
print $ua_pipe[0] $response->decoded_content;
print
和say
内置版使用间接语法来指定文件句柄。这仅允许单个标量变量或裸字:
print STDOUT "foo";
或
print $file "foo";
如果要通过更复杂的表达式指定文件句柄,则必须将该表达式括在curlies中;这称为 dative块:
print { $ua_pipe[0] } $response-decoded_content;
现在应该可以正常工作了。
我忽略了<$ua_pipe[0]>
。 readline运算符<>
也兼作glob
运算符(即对*.txt
等模式进行shell扩展)。这里,适用与say
和print
相同的规则:如果它是一个单词或一个简单的标量变量,它只会使用文件句柄。否则,它将被解释为glob模式(暗示参数的字符串化)。消除歧义:
对于readline <>
,我们必须求助于readline
内置:
while (readline $ua_pipe[0]) { ... }
要强制全局<>
,请将字符串传递给<"some*.pattern">
,或者最好使用glob
内置字符。