莫名其妙地,Perl 局部 my(array) 就像一个全局变量,在随后的迭代中很脏



只是想知道为什么@b像全局一样运行,并且每次调用子例程时都必须重置。 my(变量(不应该持续超过例程,但这个是持久的。 第一次迭代有效,但如果没有 for 循环设置为 0,后续迭代将被损坏。

此外,@b不响应 a;打印连接((;@b=(0(x@$a;映射;或任何其他对它的调用,除了直接查询 $b(#( 之外什么都没有,没有别的。 不可能是Perl盔甲上的裂缝吧?

是的,如果我注释掉第一次迭代和 for 循环,第二次迭代有效,但后续迭代无效。

sub firstDupe {
my ($a) = @_;
my @b;
# need for next line inexplicable, @b acts like global, ideas?
my $l = scalar(@{$a})+1; for ($i=0; $i < $l; $i++){ $b{$i}='0'; }
for (@{$a}){
return int($_) if $b{$_}++;
}
return -1;
}
my @pb= (2, 1, 3, 5, 3, 2);
$val=&firstDupe(@pb);
my $ret="nRet: $val";
@pb= (2, 4, 3, 5, 1);
$val=&firstDupe(@pb);
$ret = $ret.", $val";
@pb= (1);
$val=&firstDupe(@pb);
$ret = $ret.", $val";
@pb= (2,2);
$val=&firstDupe(@pb);
$ret = $ret.", $val";
@pb= (2,1);
$val=&firstDupe(@pb);
$ret = $ret.", $val";
print "nn$ret";
print "nkey: 3, -1, -1, 2, -1n";

这是因为你有$b{$i}- 也就是说,一个哈希%b,它永远不会被声明(进行词法(。

因此,它就在那里被创建为全局变量。

有了use strict;,这是不可能的。

我可以建议始终,始终使用此编译指示,甚至更use warnings;.


请注意,$a$b不建议用于变量名称,因为这些特定名称具有某种特殊地位,sort使用。

此外,您不需要在函数前面使用该&。 它具有非常特殊的属性,在这里不会受到伤害,但它不是必需的,也不应该存在。

最新更新