我想阅读我的插座并做一个" 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]>;
我不明白是不是
答案 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>
可以表示readline
或glob
,具体取决于EXPR
。
在这种情况下,您需要使用显式readline
来完成您想要的任务。
此外,您应始终在while
循环中执行句柄读取,并将任何其他流逻辑放入循环中。这是因为从文件读取的while
循环将自动检查eof
条件。你的代码当前编写的方式如果它永远不会找到正则表达式,你最终会得到一个无限循环。
要解决这两个问题,我会将处理重写为以下内容:
my $ligne;
while ( $ligne = readline $socket1[0] ) {
last if $ligne =~ /Content-Length:/;
}