为什么打印所有三个打印报表?

时间:2011-05-16 07:51:11

标签: perl

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代码打印所有三个打印语句?

它应该只打印存在,不应该吗?

4 个答案:

答案 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);

为什么会发生这种情况?这是因为:

  • =>基本上相当于,
  • List value constructors的工作方式,例如($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);