所以我正在学习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:
=>运算符是逗号的同义词,除非它使左侧的单词如果以字母或下划线开头并且仅由字母,数字和下划线组成,则将其解释为字符串.
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的答案.