gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:39:02 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com