我在使用从数组派生的哈希时遇到了一些麻烦.对于我所知道的那些元素,它没有"存在"测试.我写了一些小测试代码来证实这一点.这里是:
#!/usr/local/bin/perl
my @sieve = (2, 3, 5, 7, 11, 13, 17, 19);
my %sieve_hash = @sieve;
foreach $prime (@sieve) {
    if (exists($sieve_hash{$prime})) {
    print "$prime exists!\n";
    } else {
    print "$prime DOES NOT exist.\n";
    }
}
这是示例输出:
2 exists!
3 DOES NOT exist.
5 exists!
7 DOES NOT exist.
11 exists!
13 DOES NOT exist.
17 exists!
19 DOES NOT exist.
我究竟做错了什么?
分配给散列时,需要一组交替的键和值.以下将解决您的问题:
my %sieve_hash = map { $_ => 1 } @sieve;
有了上述,简单的真值测试(而不是存在测试)就足够了.但是,由于您正在使用存在性测试,因此可以使用以下命令来节省一些内存,undef而不是1:
my %sieve_hash;
@sieve_hash{ @sieve } = ();
要么
my %sieve_hash;
$sieve_hash{$_} = undef for @sieve;
不过,我发现真相测试更加优雅.