我刚刚遇到了一些我无法解释的非常奇怪的行为:
do {
my $qry = $self->getHTMLQuery(undef, $mech->content());
next if (!defined($qry));
push(
@prods,
map { 'http://www.XXXXYYYX.com'.$_->attr('href') }
$qry->query('div.prodInfo div.prodInfoBox a.prodLink.GridItemLink')
);
$qry->delete();
$TEST++;
last if ($TEST >= 10);
} while(eval { $mech->follow_link(class => 'jump next') });
print "WHILE ENDED\n";
上面的代码即使在
$TEST
> = 10时似乎退出while循环,也永远不会输出“ WHILE ENDED”。但是以下代码会打印“ WHILE ENDED”:
do {
my $qry = $self->getHTMLQuery(undef, $mech->content());
next if (!defined($qry));
push(
@prods,
map { 'http://www.XXXXYYYX.com'.$_->attr('href') }
$qry->query('div.prodInfo div.prodInfoBox a.prodLink.GridItemLink')
);
$qry->delete();
$TEST++;
} while(eval { $mech->follow_link(class => 'jump next') } && $TEST <= 10);
print "WHILE ENDED\n";
在这两个测试中,
$TEST
的初始值为0。last
在do...while
中的行为与for
和while {...}
中的行为不同吗?
最佳答案
就do
,next
和last
而言,带有循环修饰符的redo
块不算作实际循环。 perlsyn中提到了这一点,您将在其中找到Schwern提到的技巧,该技巧用一个裸露的方块将其包围以使last
起作用。但这对next
不起作用,因为裸块仅执行一次,所以next
的作用类似于last
。要使next
工作,可以将裸露的块放在do
中,但是last
的作用类似于next
。
如果同时需要next
和last
来使用do ... while
,最简单的方法是在continue
块中使用具有实际条件的无限循环。这两个循环是等效的,除了第二个循环是实循环,因此它可用于next
和last
:
do { ... } while condition;
while (1) { ... } continue { last unless condition };
关于perl - Perl做…while和最后一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897015/