gpt4 book ai didi

Perl 变量作用域

转载 作者:行者123 更新时间:2023-12-02 06:33:00 26 4
gpt4 key购买 nike

我想用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com