my %hash = ( 0=> , 1=>"Man");
my $key=0;
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
print "True\n" if $hash{$key};
为什么上面的Perl代码打印所有三个打印语句?
它应该只打印存在,不应该吗?
答案 0 :(得分:22)
<强> use strict; use warnings;
即可。总是
您的哈希声明没有按照您的想法进行,它具有奇数个元素。
试试这个:
use Data::Dumper;
my %hash = ( 0=> , 1=>"Man");
print Dumper(%hash);
您会看到$hash{0}
设置为1,$hash{"Man"}
存在,但undef
,$hash{1}
根本不存在。即您的哈希声明等同于:
my %hash = (0 => 1, "Man" => undef);
为什么会发生这种情况?这是因为:
=>
基本上相当于,
($a,,$b)
相当于($a,$b)
该文件的相关引文:
=>
运算符大多只是一个更具视觉冲突力的逗号同义词,但它也会安排将其左侧操作数解释为字符串,如果它是一个字符串将是一个合法的简单标识符。
和
空列表由
()
表示。在列表中对其进行插值无效。因此,((),(),())
相当于()
。类似地,插入没有元素的数组与在该点没有插入数组相同。(...)
列表
1,,3
是两个列表的串联,1,
和3
,第一个以可选逗号结尾。1,,3
(1,),(3)
1,3
(同样适用于1,,,3
(1,),(,),3
1,3
等等。)并非我们建议您使用此混淆。
将此应用于您的代码:
(0 => , 1 => "Man");
is (0 , , 1 , "Man");
is (0 , 1 , "Man");
答案 1 :(得分:9)
始终,始终, 始终 use strict;
和use warnings;
代码:
use strict;
use warnings;
my %hash = ( 0=> , 1=>"Man");
my $key=0;
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
print "True\n" if $hash{$key};
输出:
Odd number of elements in hash assignment at - line 3.
如果您希望元素存在但未定义,请使用undef
:
my %hash = ( 0=> undef, 1=>"Man");
答案 2 :(得分:4)
use warnings;
,您将看到Odd number of elements in hash assignment
。
那就是它!你有(0 =&gt; 1,&#34; Man&#34; =&gt; undef)。
答案 3 :(得分:4)
尝试启用警告。这一行
my %hash = ( 0=> , 1=>"Man");
创建一个哈希(0 =&gt;'1','Man'=&gt; undef);