可以 undef 是散列关键在Perl?

答案是否定的。

undef 无法散列关键在Perl。 但还有其微妙之处 你可能会认为可以。 下面详细说明。

什么是哈希

其中一个数据结构中存在编程语言Perl是散列。 哈是一个无序设置的价值观。 这里是一个例子哈希:

my %h = (
    aa => 1,
    bb => 2,
);

这是哈希存储的两个对数值。 关键的名称 'aa' 储存值 1, 和在关键的名称 'bb' 商店的价值 2. 获得这些价值观,使用 语法 $h{aa}$h{bb}.

什么是 undef

undef 是一个特殊价值在Perl,这意味着没有任何价值。 如果你创建的变量,但没有将其分配的任何价值的,其价值将只是 undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

该程序将显示该文本 $VAR1 = undef;.

undef 仍然是可用的,如果你访问不存在的阵元或 一个不存在的关键在一散列。 你可以明确分配 undef 的变量: $var = undef;.

错误的使用情况1

这里是一样的程序,它似乎 undef 可以是关键的散列:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

该程序将显示该文本 asdf. 即像我们创造了在哈希键 undef, 然后我得到了价值为本的关键。 但它不是。 在这个例子中,值储存 关键 'undef',即行 'undef',而不是一个真正的 undef.

发生这种情况是由于两个特征。

在创建散我们创造了它在几个关键的价值 使用代码 undef => 'asdf',. 这个代码使用操作员 =>. 的特点这个 该声明是,在一些情况下,他可以采取什么是左作为一串。 他的结论是喜欢什么是左边的 => 在引号中。 undef => 'asdf', 是实际上 'undef' => 'asdf',.

第二个特征是如何我们得到的价值从哈通过的关键。 我们使用的语法 $h{undef}. 然后Perl认为什么是在大括号内的是一串。 我们有什么写在这里是一样的 $h{'undef'}.

可以肯定的它真正地是因为如果你跑的脚本通过插入一个特殊的模块,该模块 而不是执行代码显示如何Perl了解这代码。 perl -MO=Deparse script.pl. 这里是输出:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

不正确使用的2

这里是另一个例子码错误地认为 undef 可以是关键的散列。 哦,那里就是 我们用真实的 undef,不行 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

该程序将显示该文本 asdf. 即,我们认为,我们已经创建 值在哈通过的关键 undef.

但是真的,我们已经把价值的关键 '' (an empty string). 如果附加的结束这个程序行 use Data::Dumperwarn Dumper \%h;, 之后开始在屏幕上的,实际上看起来像哈希:

$VAR1 = {
          '' => 'asdf'
        };

$var 包含一个值 undef,但是,当使用中的 $var => 'asdf',$h{$var} undef 是替换由一个空串 ''.

如果添加在码 use strict;use warnings; (这几乎总是值得做的),然后 在输出将可以看出,Perl警告说,关于这个使用情况:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

摘要

undef 不是一个值的一个关键在Perl散。 钥匙在Perl散始终是一个线。 (仅指定一个空串 '' ,也可以是钥)。 和价值观的散列可以以任何绝对的和 没有问题 undef.

其他文章