【perl】翻车日常记录:使用exists窥视多维HASH时的坑

前言

习惯了习惯了,不行就毁灭吧。

事情的经过

我自己是非常喜欢使用多维哈希结构的,因为不习惯在perl使用类(我一度不知道perl里能用类),因此多维哈希就作为最爱的替代品,我还专门总结了下基本的用法:

【perl脚本】多维HASH的一些使用总结

但是今天脚本里发生了非常奇葩的事情,让我意识到原来我理解的还是不够深,具体讲是这样的,先简单用一段代码表示:

#!/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中的&&,当然了&不是这样),使后面不要生效,这样逐级深入是避免这个问题的一种解决方式吧。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值