Perl 变量作用域

标签 perl scope

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

相关文章:

linux - 如果在 perl 脚本中运行 cp 是否会覆盖存在的文件?

if 语句中的 C++ 范围问题 : create one of two objects

pointers - Golang、指针、函数

regex - 使用 Perl 正则表达式搜索并替换特定长度的字符串

perl - 如何更改文本文件中的记录分隔符?

regex - 匹配正则表达式的所有可能的子字符串

javascript - 在 QUnit 设置中定义测试变量

php变量作用域

ruby - `class` 定义范围与 `def` 方法范围内的局部变量

perl - 无法编译我的 perl 脚本。让一切正常工作的最简单方法是什么?