PerlCritic示例:循环迭代器不是词法的



在调试一些旧的perl代码时,我使用perl-critic来发现错误。我经常偶然发现这种"循环迭代器不是词法的"策略:Perl::Critic::Policy::Variables::RequireExicalLoopIterators而且它从来都不是一个bug。当我在测试程序中实现作者的例子时,我似乎没有重现它试图解决的问题:

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my $bicycle = {is_red => 1, has_baseball_card_in_spokes => 1, has_bent_kickstand => 1, locked => 1};
my $bicycle1 = {is_green => 1, has_baseball_card_in_spokes => 1, has_bent_kickstand => 1, locked => 1};
my $bicycle2 = {is_blue => 1, has_baseball_card_in_spokes => 0, has_bent_kickstand => 0, locked => 1};
my @things_attached_to_the_bike_rack = ($bicycle,$bicycle1,$bicycle2);
for $bicycle (@things_attached_to_the_bike_rack) {
if (
$bicycle->{is_red}
and $bicycle->{has_baseball_card_in_spokes}
and $bicycle->{has_bent_kickstand}
) {
$bicycle->{locked} = 0;
last;
}
}
if ( $bicycle and !$bicycle->{locked} ) {
print "riding home in time for dinnern";
}

诚然,我并没有用函数创建一个幸运的对象,而是使用了一个散列引用,所以它可能与Perl中的对象有关。即使我重新安排了阵列的顺序,我每次都会及时回家吃晚饭。所以我一定遗漏了一些明显的东西,我想用一个可复制的例子来展示这是一个问题时的情况。

我意识到这方面有一些老问题,但我想知道这在2021年末是否仍然是一项相关政策。

您的代码与策略示例不同。您的代码在循环外为$bicycle分配一个值,而策略示例没有。

以下代码更能代表策略示例的意图:

use strict;
use warnings;
use diagnostics;
my $bicycle0 = {is_red => 1, has_baseball_card_in_spokes => 1, has_bent_kickstand => 1, locked => 1};
my $bicycle1 = {is_green => 1, has_baseball_card_in_spokes => 1, has_bent_kickstand => 1, locked => 1};
my $bicycle2 = {is_blue => 1, has_baseball_card_in_spokes => 0, has_bent_kickstand => 0, locked => 1};
my @things_attached_to_the_bike_rack = ($bicycle0, $bicycle1, $bicycle2);
my $bicycle;
for $bicycle (@things_attached_to_the_bike_rack) {
if (
$bicycle->{is_red}
and $bicycle->{has_baseball_card_in_spokes}
and $bicycle->{has_bent_kickstand}
) {
$bicycle->{locked} = 0;
last;
}
}
if ( $bicycle and !$bicycle->{locked} ) {
print "riding home in time for dinnern";
}

当我运行这个时,我不会像预期的那样看到riding home in time for dinner消息,就像我运行原始代码时一样。

最新更新