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

Man*_*Man 10 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};
Run Code Online (Sandbox Code Playgroud)

为什么上面的Perl代码打印所有三个打印语句?

它应该只打印Exists,不应该吗?

Mat*_*Mat 22

use strict; use warnings;.总是.

您的哈希声明没有按照您的想法进行,它具有奇数个元素.

试试这个:

use Data::Dumper;
my %hash = ( 0=> , 1=>"Man");
print Dumper(%hash);
Run Code Online (Sandbox Code Playgroud)

您将看到$hash{0}设置为1,$hash{"Man"}存在但是undef,并且$hash{1}根本不存在.即你的哈希声明相当于:

my %hash = (0 => 1, "Man" => undef);
Run Code Online (Sandbox Code Playgroud)

为什么会这样?这是因为:

  • => 基本上相当于 ,
  • 列表值构造函数以这种方式工作,例如($a,,$b)等同于($a,$b)

    该文件的相关引用:

    =>运营商大多只是视觉上更加鲜明的逗号代名词,但它也安排了左侧操作数被解释为一个字符串,如果它是将是一个合法的简单标识的裸词.

    和:

    空列表由表示().在列表中对其进行插值无效.因此((),(),())相当于().类似地,插入没有元素的数组与在该点没有插入数组的情况相同.

    (......)

    该列表1,,3是两个列表的串联,1,并且3第一个列表以该可选逗号结尾.1,,3(1,),(3)1,3(类似的1,,,3(1,),(,),31,3等).不,我们会建议你使用这个混淆.

    将此应用于您的代码:

       (0 => , 1 => "Man");
    is (0 , , 1 , "Man");
    is (0 , 1 , "Man");
    
    Run Code Online (Sandbox Code Playgroud)
    • 在这篇文章之前,我甚至不知道一只猫在`perl`中写了一些可怕的东西,如`(1 ,,,,,,, 2)`. (2认同)

    Chr*_*utz 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};
    
    Run Code Online (Sandbox Code Playgroud)

    输出:

    Odd number of elements in hash assignment at - line 3.
    
    Run Code Online (Sandbox Code Playgroud)

    如果您希望元素存在但未定义,请使用undef:

    my %hash = ( 0=> undef, 1=>"Man");
    
    Run Code Online (Sandbox Code Playgroud)