Perl - Hash和=>运算符

Bra*_*Ess 4 perl hash

所以我正在学习Perl并进入关于哈希的章节.我知道'=>'运算符是逗号运算符的别名.但是当我尝试制作一个值undef时,我得到了警告

在连接(.)中使用未初始化的值$ last_name {"dino"}或在./learning.pl第18行使用字符串.

use warnings;
use strict;

my %last_name = (
    fred   => 'flintston',
    dino   =>  undef,
    barney => 'rubble',
    betty  => 'rubble',
);

my $key;
my $value;

if(%last_name) {
    foreach $key (sort keys %last_name) {
        print("$key => $last_name{$key}\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我将哈希线更改为:

my %last_name = (
    fred   => 'flintston',
    dino   =>  undef =>
    barney => 'rubble',
    betty  => 'rubble',
);
Run Code Online (Sandbox Code Playgroud)

它工作正常,并返回值为undef.我所做的只是替换使用'=>'运算符分隔键/值的逗号运算符.

如果两个运算符应该是相同的,为什么后面的工作而不是前者?

cho*_*oba 11

它们并不完全相同."胖逗号"还做了一件事:当它是一个单词时,它会引用左侧操作数.因此,

undef, 1
Run Code Online (Sandbox Code Playgroud)

相当于

undef(), 1
Run Code Online (Sandbox Code Playgroud)

undef => 1
Run Code Online (Sandbox Code Playgroud)

相当于

'undef', 1
Run Code Online (Sandbox Code Playgroud)

perlop:

=>运算符是逗号的同义词,除非它使左侧的单词如果以字母或下划线开头并且仅由字母,数字和下划线组成,则将其解释为字符串.

  • 所以`$ last_name {dino}`的值不是未定义的标量值`undef`,而是5个字母的字符串`"undef"`. (3认同)

Fab*_*ica 7

Choroba已经回答了,但我认为稍微扩展一下是有用的.

在第一种情况下,当您收到警告时,这是因为您正在打印一个undef值:键的值'dino'未定义.请注意,当您设置哈希值时,您不会收到任何警告,因为为键提供未定义的值是完全正常的.仅当您尝试使用此未定义值时,警告才会显示; 最好在使用前检查它,如下所示:

if (defined $last_name{$key}) {
    print("$key => $last_name{$key}\n");
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以避免警告.

有趣的部分出现在你的第二个案例中.要了解会发生什么,您可以在最后运行此代码:

if (defined $last_name{'dino'}) {
    print "last_name{'dino'} is defined, and its value is $last_name{'dino'}\n";
    if ($last_name{'dino'} =~ /^[u][n][d][e][f]$/) {
        print "It matches, which means that the value of last_name{'dino'} " .
              "is not undefined, it's the string 'undef'\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

两者if都是真实的,这表明该值$last_name{'dino'} 定义,它是字符串"民主基金".当然它令人困惑,但它已被定义.因此,您不会收到任何警告.

所有这些都是了解正在发生的事情的方法.要了解原因,请查看choroba的答案.