使用< $ socket [i]>读取数组中的套接字在perl

时间:2014-10-09 10:43:24

标签: arrays perl sockets

我想阅读我的插座并做一个" getline"在他们身上。

my @socket1;
$socket1[0] = IO::Socket::INET->new(
    Type     => SOCK_STREAM,
    PeerAddr => "127.0.0.1",
    Proto    => "tcp",
    PeerPort => $dbase_param{camera_stream}
) or die "Cannot open socket on port " . $dbase_param{camera_stream} . ".\n";

print { $socket1[0] } "\n";
my $ligne = <$socket1[0]>;

while ( !( $ligne =~ /Content-Length:/ ) ) {
    $ligne = <$socket1[0]>;
}

它会告诉我Use of uninitialized value $ligne in pattern match (m//)第二个$ligne = <$socket1[0]>;

我不明白是不是

2 个答案:

答案 0 :(得分:5)

角括号也用于glob()

perl -MO=Deparse -e '$ligne = <$socket1[0]>;'
use File::Glob ();
$ligne = glob($socket1[0]);

所以,如果您没有使用普通标量作为套接字,那么使用readline()

可能更明确
$ligne = readline($socket1[0]);

答案 1 :(得分:2)

I/O Operator <EXPR>可以表示readlineglob,具体取决于EXPR

在这种情况下,您需要使用显式readline来完成您想要的任务。

此外,您应始终在while循环中执行句柄读取,并将任何其他流逻辑放入循环中。这是因为从文件读取的while循环将自动检查eof条件。你的代码当前编写的方式如果它永远不会找到正则表达式,你最终会得到一个无限循环。

要解决这两个问题,我会将处理重写为以下内容:

my $ligne;

while ( $ligne = readline $socket1[0] ) {
    last if $ligne =~ /Content-Length:/;
}