perl - 为什么我的哈希不是 undef?

标签 perl hash

我在 Perl 中有以下(从错误中理想化的)简短脚本:

my %metadata = undef;
if (defined %metadata)
{
    print "defined";
}

出于某种原因,程序的输出总是“定义”的。因此,将散列设置为“未定义”以某种方式使其定义。它是否被定义为“未定义”?

编辑:

这是一个理想化的案例,试图复制问题。我实际上在做什么更像是:
my %metadata = my_sub_function();
if (defined %metadata)
{
    print "defined";
}

my_sub_function 的输出可能是 undef、() 或填充的散列,我只想在这些情况的最后一个打印“定义”。

编辑2:

顺便说一句,我发现
if (scalar(keys %metadata)

对于 () 行为正确,但对于 undef 仍然不正确。

最佳答案

尝试

 my %metadata;
 undef %metadata;
 if (defined %metadata)
 {
     print "defined";
 }

我认为它只是使用“undef”作为数据来填充散列。

“使用警告”会说:
defined(%hash) is deprecated at t.pl line 6.
    (Maybe you should just omit the defined()?)
Odd number of elements in hash assignment at t.pl line 4.
Use of uninitialized value in list assignment at t.pl line 4.

undef, () or a populated hash



如果你真的想区分空散列和没有散列,最好使用散列引用(从子例程传递也更轻,没有传递复制等等)。

关于perl - 为什么我的哈希不是 undef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3958378/

相关文章:

java - 好的哈希函数? (32位太小,64位太大)

perl - 在perl中动态创建散列的散列

ruby - 要散列的散列数组

Perl - 将参数作为散列键值对问题传递给子例程

perl - 如何在MetaCPAN上进行滚动搜索?

perl - 进行替换直到某些条件为真

bash - SSH Heredoc在另一台服务器上运行Perl脚本找不到正确的路径

哈希表 : why buckets?

perl:确定字符串数组大小的方法似乎不起作用

regex - Perl 正则表达式压缩多个换行符