perl while循环遍历变量。

时间:2015-04-12 05:10:22

标签: perl

这个小片段来自LWP perl oreilly书的第一章。 这一行

$count++ while $catalog =~ m/Perl/gi; 

困惑我

我不明白while语句是如何遍历$ catalog变量中的行来查找匹配的,我甚至不知道如何用英语解释该行的含义更少perl

#!/usr/bin/perl -w
use strict ;
use LWP::Simple ;
my $catalog = get("http://www.oreilly.com/catalog");
my $count = 0;
$count++ while $catalog =~ m/Perl/gi;
print "$count\n";

所以我试着长时间写出来但无济于事。

#!/usr/bin/perl -w
use strict ;
use LWP::Simple ;
my $catalog = get("http://www.oreilly.com/catalog");


open( my $fh_catalog ,"<" , $catalog) || die "cant open $!";
while (<$fh_catalog>) {
    print $_ ;
    sleep 1;
}

我甚至尝试过

#!/usr/bin/perl -w
use strict ;
use LWP::Simple ;
my $catalog = get("http://www.oreilly.com/catalog");

while (<$catalog>) {
    print $_ ;
    sleep 1;
}

1 个答案:

答案 0 :(得分:4)

$catalog包含字符串<!DOCTYPE HTML PUB[...][newline][newline]<html>[...]

您的第一个代码段失败,因为$catalog不包含文件名。

您的第二个代码段失败,因为$catalog不包含文件句柄。

当使用/g修饰符的匹配运算符使用标量上下文时,它会从最后一次搜索停止的位置进行搜索。

模拟将是

use Time::HiRes qw( sleep );  # Support sleeping fractions of seconds.
$| = 1;  # Turn off STDOUT's output buffering.
for my $i (0..length($content)-1) {
   print(substr($content, $i, 1));
   sleep 0.1;
}

让我们使用一个更简单的字符串作为例子。

my $s = "a000a000a000";
++$count while $s =~ /a/g;

以下是发生的事情:

  1. 执行匹配运算符。它找到第一个a,设置pos($s) = 1;,然后返回true。
  2. 输入循环体,$count递增。
  3. 执行匹配运算符。它的行为就像字符串以pos($s)1)开头,找到第二个a,设置pos($s) = 5;,然后返回true。
  4. 输入循环体,$count递增。
  5. 执行匹配运算符。它的行为就像字符串以pos($s)5)开头,找到第三个a,设置pos($s) = 9;,然后返回true。
  6. 输入循环体,$count递增。
  7. 执行匹配运算符。它的行为就像字符串以pos($s)9)开头一样,无法找到匹配项,清除pos($s)并返回false。循环退出。
  8. 如果字符串的某些字符是换行符,则不会发生任何变化。