PerlCritic 示例:循环迭代器不是词法的
PerlCritic example: loop iterator is not lexical
在调试一些较旧的 perl 代码时,我使用 perl critic 来发现错误。
我经常偶然发现这个 'Loop iterator is not lexical' 政策:
Perl::Critic::Policy::Variables::RequireLexicalLoopIterators
而且它从来都不是错误。
当我在测试程序中实现作者的示例时,我似乎没有重现它试图解决的问题:
#!/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 dinner\n";
}
诚然,我没有用函数创建一个有福的对象,而是一个散列引用,所以它可能与 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 dinner\n";
}
当我 运行 这样做时,我没有看到 riding home in time for dinner
消息,正如我在 运行 你的原始代码时看到的那样。
在调试一些较旧的 perl 代码时,我使用 perl critic 来发现错误。 我经常偶然发现这个 'Loop iterator is not lexical' 政策: Perl::Critic::Policy::Variables::RequireLexicalLoopIterators 而且它从来都不是错误。 当我在测试程序中实现作者的示例时,我似乎没有重现它试图解决的问题:
#!/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 dinner\n";
}
诚然,我没有用函数创建一个有福的对象,而是一个散列引用,所以它可能与 Perl 中的对象有关。 即使我重新安排数组的顺序,我每次都会准时回家吃晚饭。 所以我一定遗漏了一些明显的东西,我想要一个可重现的例子来说明这是一个问题。
我知道有
您的代码与策略示例不同。您的代码在循环外为 $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 dinner\n";
}
当我 运行 这样做时,我没有看到 riding home in time for dinner
消息,正如我在 运行 你的原始代码时看到的那样。