【发布时间】:2016-05-18 22:56:14
【问题描述】:
我刚刚遇到了一些我真的无法解释的非常奇怪的行为:
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, $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。
do...while 中的last 的行为与for 和while {...} 中的行为是否不同?
【问题讨论】:
-
我假设您第二次说“上面的代码”,实际上是指“代码下面”
-
当
do {...} while循环位于真正的while {...}中时,情况会更糟。您尝试在内部循环中使用last和next,但它们会影响外部循环。在你意识到这个 Perl 陷阱之前,这是一个 WTF 情况。顺便说一句,它在perltrapdoc 中列出。
标签: perl