这个小片段来自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;
}
答案 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;
以下是发生的事情:
a
,设置pos($s) = 1;
,然后返回true。$count
递增。pos($s)
(1
)开头,找到第二个a
,设置pos($s) = 5;
,然后返回true。$count
递增。pos($s)
(5
)开头,找到第三个a
,设置pos($s) = 9;
,然后返回true。$count
递增。pos($s)
(9
)开头一样,无法找到匹配项,清除pos($s)
并返回false。循环退出。如果字符串的某些字符是换行符,则不会发生任何变化。