perl中的无限循环
我想从tcp流文件中提取除http头以外的内容 内容如下 当满足两个^M时,http标头结束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
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