Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl中的无限循环_Perl - Fatal编程技术网

perl中的无限循环

perl中的无限循环,perl,Perl,我想从tcp流文件中提取除http头以外的内容 内容如下 当满足两个^M时,http标头结束 HTTP/1.1 200 OK^M Last-Modified: Sat, 20 Mar 2010 09:43:12 GMT^M Content-Type: video/x-flv^M Date: Wed, 24 Oct 2012 14:34:13 GMT^M Expires: Wed, 24 Oct 2012 14:34:13 GMT^M Cache-Control: private, ma

我想从tcp流文件中提取除http头以外的内容 内容如下 当满足两个^M时,http标头结束

HTTP/1.1 200 OK^M 
Last-Modified: Sat, 20 Mar 2010 09:43:12 GMT^M 
Content-Type: video/x-flv^M 
Date: Wed, 24 Oct 2012 14:34:13 GMT^M 
Expires: Wed, 24 Oct 2012 14:34:13 GMT^M 
Cache-Control: private, max-age=22124^M 
Accept-Ranges: bytes^M 
Content-Length: 29833281^M 
Connection: close^M 
X-Content-Type-Options: nosniff^M 
Server: gvs 1.0^M 
^M 
FLV^A^E^@^@^@   ^@^@^@^@^R^@^CK^@^@^@^@^@^@^@^B^@ 
onMetaData^H^@^@^@^O^@^Hduration^@@i<97> 
=p£×^@  starttime^@^@^@^@^@^@^@^@^@^@^Mtotalduration^@@i<97>
HTTP/1.1200正常^M
最后修改:2010年3月20日星期六09:43:12 GMT^M
内容类型:视频/x-flv^M
日期:2012年10月24日星期三14:34:13 GMT^M
到期时间:2012年10月24日星期三14:34:13 GMT^M
缓存控制:专用,最大年龄=22124^M
接受范围:字节^M
内容长度:29833281^M
连接:关闭^M
X-Content-Type-Options:nosniff^M
服务器:gvs 1.0^M
^M
菲律宾(香港)(香港)(香港)(香港)(香港)(香港))(香港))(香港)(香港)(香港))
onMetaData ^H^@^^^@^^^^^^^^^^^^^^^^^^^^^^^^^持续时间^i
=p×^@starttime^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Mtotalduration ^@i
我提取的代码如下:, 然后我运行:extract.pl
#!/usr/bin/perl 
$start=0; 
$data=""; 
while(<STDIN>) 
{ 
    if ( $start eq 0 && $_ =~ /^\r\n/) { $start = 1; } 
    elsif ( $start eq 1 ) { $data = $data . $_; } 
} 
open(FH, ">sample.flv"); 
print FH $data; 
close(FH);
#/usr/bin/perl
$start=0;
$data=“”;
while()
{ 
如果($start eq 0&&$\r\n/){$start=1;}
elsif($start eq 1){$data=$data.$\u;}
} 
开放式(FH,“>sample.flv”);
打印FH$数据;
关闭(FH);

在读取数据之前,调用STDIN上的
binmode()
,文件内容可能会干扰文件读取。在写入数据之前,您还需要在FH上使用它。这是一条单行线。然而,我认为没有理由有任何无休止的循环

perl -00 -lne '$i++ and print' file > sample.flv
哪个地方看起来像这样:

>perl -MO=Deparse -00 -lne '$i++ and print' input.txt
BEGIN { $/ = ""; $\ = "\n\n"; }        # from -l and -00
LINE: while (defined($_ = <ARGV>)) {   # from -n
    chomp $_;                          # from -l, removes "\n\n" now
    print $_ if $i++;                  # skips the first line
}
-e syntax OK

为什么不使用像
LWP
WWW::Mechanize
这样的标准模块来进行刮取呢?为了语义正确性,
eq
是字符串比较运算符。如果您知道您的值将是整数,那么应该使用
=
。或者,更好的是,因为他们基本上是布尔人,所以就这样使用他们
if(!$start&&/^\r\n/)…
:Sphere是一个单行程序,基本上满足您的要求:
perl-E'1直到eq“\015\012”;打印'sample.flv
我将
while
循环一分为二,并添加了一个中断条件以在它们之间切换(当前行必须由
\r\n
组成)。它还可以打得更远。
perl -pi -le 's/[\r\n]+$//' input.txt