如何在没有任何键/值对时检查是否定义了 Perl 哈希

Ala*_*ith 1 perl hash

我试图找出一种方法来检查在模块函数内部时是否在 Perl 脚本中声明了哈希。

给定以下脚本(文件script.pl):

#!/usr/bin/perl -w

use strict;
use checkHash;

our %testHash = ("key"=>"value");

print &checkHash() ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

连同这个模块(checkHash.pm);

sub checkHash {
    if(%main::testHash) {
        return 1;
    }
    else {
        return 0;
    }
}

1;
Run Code Online (Sandbox Code Playgroud)

在装有OS X v10.6.7 (Snow Leopard) 和 Perl v5.10.0的 Mac 上运行,checkHash 的返回值是我所期望的“1”。但是,如果我通过更改行从脚本中删除键值对:

our %testHash = ("key"=>"value");
Run Code Online (Sandbox Code Playgroud)

到:

our %testHash = ();
Run Code Online (Sandbox Code Playgroud)

返回值为“0”。我最初的假设是这将是“1”,但在阅读了我正在使用的测试方法测试散列中的大小后,我明白为什么这是不正确的想法。

是否有可以在 checkHash 模块中使用的测试,如果它测试的哈希存在,则返回 true,但没有为其分配任何键?

yst*_*sth 5

defined() 不是对聚合(数组和散列)的有意义的测试。 perldoc -f defined是这样说的:

不推荐在聚合(散列和数组)上使用“定义”。它用于报告该聚合的内存是否曾经被分配过。这种行为可能会在 Perl 的未来版本中消失。您应该改为使用简单的大小测试:

               if (@an_array) { print "has array elements\n" }
               if (%a_hash)   { print "has hash members\n"   }
Run Code Online (Sandbox Code Playgroud)

  • 这就是重点:“散列已经存在”是一个毫无意义的测试。变量在需要时存在,或者在严格条件下,对于词法或非限定包变量,当您声明它们时。应该没有必要做你想做的事情。 (3认同)