前言
习惯了习惯了,不行就毁灭吧。
事情的经过
我自己是非常喜欢使用多维哈希结构的,因为不习惯在perl使用类(我一度不知道perl里能用类),因此多维哈希就作为最爱的替代品,我还专门总结了下基本的用法:
但是今天脚本里发生了非常奇葩的事情,让我意识到原来我理解的还是不够深,具体讲是这样的,先简单用一段代码表示:
#!/usr/bin/perl
print "Hello, World!\n";
my %hash;
$hash{test}{1} = "nihao";
...
...
if(exists exists $hash{error}{1}){
print "xxxx";
}
if(exists $hash{error}){
print "yyyy";
}
在程序中,我在多维哈希中赋了大量的值,后面我需要检查某个维度的key是否存在,因此我是用了 exists $hash{error}{1} 的方式来确认是否存在这个key,显而易见,这个key是不存在的;进一步讲,不仅$hash{error}{1}不存在,连$hash{error}都不存在!
但问题就出在这一步,这个代码的打印结果是:
Hello, World!
yyyy
这意味着什么呢?意味着exists $hash{error}{1}这个对第二维的窥视,在执行时首先生成了第一维$hash{error}的key!这一点确实大大出乎我的意料,导致后面的代码直接崩溃了,各种判断异常与失误,后来我改了一下:
#!/usr/bin/perl
print "Hello, World!\n";
my %hash;
$hash{test}{1} = "nihao";
if(exists $hash{error} and exists $hash{error}{1}){
print "xxxx";
}
if(exists $hash{error}){
print "yyyy";
}
通过and逻辑的特点(前面的条件不成立,就不会执行后面的条件,基本所有语言都是这个道理,比如system verilog中的&&,当然了&不是这样),使后面不要生效,这样逐级深入是避免这个问题的一种解决方式吧。