Perl do … while和last命令

前端之家收集整理的这篇文章主要介绍了Perl do … while和last命令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚遇到一些非常奇怪的行为,我真的无法解释:
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 };
原文链接:https://www.f2er.com/Perl/172360.html

猜你在找的Perl相关文章