perl - Perl做…while和最后一个命令

标签 perl

我刚刚遇到了一些我无法解释的非常奇怪的行为:

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。

lastdo...while中的行为与forwhile {...}中的行为不同吗?

最佳答案

donextlast而言,带有循环修饰符的redo块不算作实际循环。 perlsyn中提到了这一点,您将在其中找到Schwern提到的技巧,该技巧用一个裸露的方块将其包围以使last起作用。但这对next不起作用,因为裸块仅执行一次,所以next的作用类似于last。要使next工作,可以将裸露的块放在do中,但是last的作用类似于next

如果同时需要nextlast来使用do ... while,最简单的方法是在continue块中使用具有实际条件的无限循环。这两个循环是等效的,除了第二个循环是实循环,因此它可用于nextlast

do { ... } while condition;
while (1) { ... } continue { last unless condition };

关于perl - Perl做…while和最后一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897015/

相关文章:

python - Perl:有效地计算许多字符串中的许多单词

java - printf 如何用前导零做 float

linux - 在多核和并行处理上运行脚本

perl - 我应该在不会返回到堆栈上的 Perl 的 SV 上调用 SvREFCNT_dec() 吗?

perl - 如何在 Windows 上的 Komodo IDE 5.1 中启用 PerlCritic 支持?

perl - 在 perl 中查找正则表达式匹配的所有可能的起始位置,包括重叠匹配?

perl - plink-使用 Windows 中的 python 程序运行位于远程 Linux 服务器上的 perl 脚本时出现 @INC 错误中无法定位 .pl

xml - 使用 Perl 模块时的最佳实践

html - 使用 Perl 从 MySQL 填充下拉列表

Windows (XP)/Unix (Solaris) 上的 Perl 脚本配置和相对路径实现