【发布时间】:2009-11-03 22:56:09
【问题描述】:
以下代码 sn-p 读取 HTTP 响应。假设响应不包含 Content-Length 标头且 Content-Type 不是 text/html,如何终止 while 循环?
(1.不用担心分块传输编码 2.没有IO::Socket)
while(defined($line = <SOCK>))
{
$data .= $line;
if($line =~ /Content-length:/isg)
{
($cl) = $line =~ /Content-Length: ([0-9]+)/i;
}
$line =~ s/\n//g;
$line =~ s/\r//g;
if($line eq '' && $cl)
{
read(SOCK, $data, $cl, length($data));
last;
}
if($line =~ /<\/html>/) { last; }
}
【问题讨论】:
-
您不必检查
definedness,它会自动为您检查。 -
如果您在 while() 中分配给自己的变量,则定义的检查不是隐式的。只有当您拥有 readline 运算符时,它才是隐含的。
-
基于cmets,我想你可能有不同的问题。你真的在乎是否有内容长度,还是只想知道什么时候拥有所有内容?例如,如果服务器设置为保持活动状态,则一旦完成一个请求,您就可以在同一连接上创建另一个请求。如果发生这种情况,我认为您有不同的问题。