1

私はPerlにかなり慣れていません。私の Perl プログラムは、ブラウザから HTTP 要求メッセージを取得しています。最後の空白行を検出したいと考えています。

を使用しようとしまし$_ =~ /\S/たが、機能しません:

while (<CONNECTION>) {
  print $_;
  if ($_ =~ /\S/) {print "blank line detected\n"; }
}

出力は

GET / HTTP/1.1
blank line detected
Host: xxx.ca:15000
blank line detected
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
blank line detected
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
blank line detected
Accept-Language: en-us,en;q=0.7,zh-cn;q=0.3
blank line detected
Accept-Encoding: gzip, deflate
blank line detected
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
blank line detected
Connection: keep-alive
blank line detected
Cookie: __utma=32770362.1159201788.1291912625.1308033463.1309142872.11; __utmz=32770362.1307124126.7.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=Manitoba%20Locum%20Tenens%20Program; __utma=70597634.1054437369.1308785920.1308785920.1308785920.1; __utmz=70597634.1308785920.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=leung%20carson
blank line detected



私は chomp() を使おうとしていましたが、これもうまくいきません:

  while (<CONNECTION>) {
    chomp(); 
    print "$_\n";
    if ($_ eq "") {print "blank line detected\n"; }
  }

出力:

GET / HTTP/1.1
Host: xxx.ca:15000
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,zh-cn;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: __utma=32770362.1159201788.1291912625.1308033463.1309142872.11; __utmz=32770362.1307124126.7.3.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=Manitoba%20Locum%20Tenens%20Program; __utma=70597634.1054437369.1308785920.1308785920.1308785920.1; __utmz=70597634.1308785920.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=leung%20carson

よろしくお願いします〜

4

2 に答える 2

3

空白だけの行を検出するには、

while (<CONNECTION>) {
  print $_;
  if ($_ =~ /\S/) {print "blank line detected\n"; }
}

する必要があります

while (<CONNECTION>) {
   print $_;
   if ($_ !~ /\S/) {print "blank line detected\n"; }
}

または略して、

while (<CONNECTION>) {
   print;
   if (!/\S/) {print "blank line detected\n"; }
}

理由

while (<CONNECTION>) {
   chomp(); 
   print "$_\n";
   if ($_ eq "") {print "blank line detected\n"; }
 }

HTTP ヘッダー行が \r\n で終わるため、機能しない可能性があります。あなたが必要だろう

while (<CONNECTION>) {
   s/\r?\n//; 
   print "$_\n";
   if ($_ eq "") {print "blank line detected\n"; }
 }
于 2011-06-30T20:45:26.633 に答える
1

私はあなたが欲しいと思います:

/^\s+$/

空行検出用。

/\S/ を使用すると、非空白行が検出されます。

さらに良いのは、Net::HTTP や LWP などを使用して、面倒な作業を行うことです。HTTP エンコーディングの問題のいくつかは微妙です。

于 2011-06-30T20:44:23.630 に答える