只是想知道为什么@b表现得像全局,每次调用子程序时都必须重置.我的(变量)不应该超过例程,但这个是持久的.第一次迭代可以工作,但是后续的迭代会在没有for循环设置为0的情况下被破坏.
另外,@ b没有响应; 打印加入(); @ B =(0)X @ $一个; 映射; 或者对它的任何其他调用,除了直接查询$ 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 "\n\n$ret";
print "\nkey: 3, -1, -1, 2, -1\n";
zdi*_*dim 14
这是因为你有$b{$i}- 也就是哈希 %b,它从未被声明(做成词法).
所以它就在那里被创建为一个全局变量.
这是不可能的use strict;.
我可以建议总是,总是使用这个pragma,甚至更多use warnings;.
请注意,$a并且$b不建议使用变量名称,因为这些特定名称有一些特殊的名称,正在被使用sort.
此外,您不需要&在功能面前.它具有非常特殊的属性,在这里不会受到伤害,但它不是必需的,它不应该存在.