我刚刚遇到一些非常奇怪的行为,我真的无法解释:
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";
上面的代码不会打印“WHILE ENDED”,即使在$TEST> = 10时它似乎也在while循环中出现.
但以下代码打印“WHILE ENDED”:
do { my $qry = $self->getHTMLQuery(undef,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.
最后的行为是…而不是在…而不是…而{…}
解决方法
一个循环修饰符的块不会被视为一个真正的循环,直到下一个,最后一个和重做.这在
perlsyn提到,在那里你会发现施文恩提到的关于周围环绕它的裸片,以使上一个工作.但是,下一步将不起作用,因为一个裸片只能执行一次,所以下一个像最后一样.要做下一个工作,你可以把裸机放在do里面,但是最后一个会像下一个那样做.
如果你需要下一个和最后一个工作的时候,最简单的方法是使用一个无限循环与一个继续块中的真实条件.这两个循环是等效的,除了第二个循环是一个真正的循环,所以它适用于下一个&持续:
do { ... } while condition; while (1) { ... } continue { last unless condition };