我想用 this 从数组中删除重复值方法。重复删除必须在循环内执行。 这是一个演示我遇到的问题的最小示例:
use strict;
for (0..1){
my %seen;
sub testUnique{
return !$seen{shift}++;
}
my $res = testUnique(1);
if($res){
print "unique\n";
}else{
print "non-unique\n";
}
}
我在循环内定义了 %seen
散列,因此我希望它仅在循环的单次迭代期间定义。
然而,上述代码的结果是:
unique
non-unique
通过一些调试打印,我发现 %seen
的值从一个迭代到另一个迭代被保留。
我尝试了一个小的
for (0..1){
my %seen;
$seen{1}++;
print "$seen{1}\n";
}
这一个按预期工作。它打印:
1
1
所以,我猜问题出在内部函数 testUnique
上。
有人可以向我解释这里发生了什么吗?
最佳答案
您的 testUnique
sub 在 %seen
的第一个实例上关闭。即使它在 for
循环内,子例程也不会被重复编译。
您的代码只编译一次,包括在for
循环的顶部初始化词法范围变量%hash
的部分 .
以下将产生您想要的输出,但我不确定我看到的是沿着这条路走下去:
#!/usr/bin/env perl
use warnings;
use strict;
for (0..1){
my %seen;
my $tester = sub {
return !$seen{shift}++;
};
print $tester->(1) ? "unique\n" : "not unique\n";
}
关于Perl 变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28550513/