[置顶] perl脚本中defined,exists和delete关键字的用法和区别
刚学习perl脚本的时候,喜欢频繁使用defined关键字判断一个hash中某个key是否存在,后来程序出了问题才去perl官方文档查看关于defined关键字的准确使用方法。因此,这里我把perl中几个关键字的用法和区别加以介绍,希望大家能够有所借鉴。
defined()和exists():
在perl脚本中,undef是一个非常特殊的整数,这个整数用来表示失败、系统错误、文件末尾、未初始化的变量以及其他一系列的异常情况。了解了undef这个变量,那么就可以来看defined变量的作用了。当defined子程序的参数是一个变量的时候,作用非常的简单,就是用来判断这个变量是否为undef.怎么样,defined函数的目的很单纯吧?哈哈。可是,如果用一个简单的布尔判断去判断一个变量,与用defined去判断一个变量有什么区别呢?原来,在进行简单的bool判断的时候,perl解释器并不区分undef,空字符串,数字0以及字符串“0”,也就是说,以下子程序任何总是输出"not ok",无论$a的值是undef ,空字符串或者数字0或者字符串0;注意,undef在perl中仅仅是一个整数,他所被赋予的特殊含义(比如失败,文件末尾,系统错误等)只是出于习惯。所以,undef并不一定表示系统出现异常。比如,perl中pop操作在两种情况下会返回异常:1,被弹出的数组已经为空 2:被弹出的这个元素不是别人,正好是undef。
defined函数以聚合性变量(如数组和哈希)作为参数的习惯已经被新版本的perl废弃。旧版本的perl使用这种形式来判断数据或者哈希是否已经被分配内存。新版本的perl中,我们完全可以用perl的scalar函数的返回值来进行判断。但是我们经常可以看到defined函数的参数是哈希的某个元素,如,defined($hash{$key}),这种情况下的用法需要引起特别注意,它是告诉我们这个$key对应的值是否定义,而不是这个$key是否存在(即如果这个key存在,但是它对应的value未定义,那么defined返回false而exists依然返回true。当然,如果这个key不存在,exists和defined同样都返回false)。一般,如果要判断这个key是否存在,我们使用exist函数,因为exists函数与这个key对应的value是否定义无关。
if($a){
print "ok";
}
else{
print "not ok.";
}
delete():
在功能上,delete与exists几乎完美对应。它将对应哈希表中的key和value一并删除。此时exists将会返回false.这与将一个哈希表的某个key对应的value设置为undef不一样。最重要也是最奇怪的一点,如果所删除的不是该数组的最后一个元素,那么delete操作竟然不会改变该array的size,也就是说,delete前后,用scalar函数检测该array,得到是相同的结果。而且用foreach遍历输出该array,发现该array对应的被删除的位置依然存在,只不过该位置已经没有任何值了。如果删除的是array的最后一个值 ,那么该array的size会对应减小,而且该值的占位也被删除了,此时的效果与shift()完全相同。
[置顶] perl脚本中defined,exists和delete关键字的用法和区别的更多相关文章
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...
- [置顶] ios 网页中图片点击放大效果demo
demo功能:点击网页中的图片,图片放大效果的demo.iphone6.1 测试通过. demo说明:通过webview的委托事件shouldStartLoadWithRequest来实现. demo ...
- [置顶] mysql中的set和enum类型的用法和区别
mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值. CREATE TABLE `20121101_t` ( ...
- [置顶] ASP.Net中服务器控件的生命周期
(1)初始化:在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置;二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重 ...
- [置顶] ios App 中嵌入应用商店
昨晚同事拿了一个app 发现其app 内部页面打开了appstore 并没有唤起手机自带的appstore, 刚开始以为是用webview 加载的 ,可是自己些了一个demo 发现并不是那样一回事 用 ...
- [置顶] Android4.0中修改挂断键(ENDCALL)的默认行为
文件: frameworks/base/core/java/android/provider/Setings.java public static final String END_BUTTON_BE ...
- [置顶] 在js中如何实现方法重载?以及函数的参数问题
都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数argum ...
- [置顶]
Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...
- 【转】[置顶] 在Android中显示GIF动画
gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...
随机推荐
- github版本库使用详细图文教程(命令行及图形界面版)
投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 时间:2015-08-06我要评论 今天我们就来学习github的使用,我们将用它来管理我们的代码,你会发现它的好处的,当然是要在本系列教程全 ...
- which 查看可执行文件的位置
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. ...
- 编程器NAND Flash 技术入门
NAND Flash分类 SLC(Single-Level Cell)架构:单一储存单元(Cell)可储存1bit data MLC(Multi-Level Cell)架构:单一储存单元(Cell)可 ...
- jdk、jre与jvm的区别与联系
为了学习数据库,重装了系统,之前前一直在用eclipse,现在准备换成myeclipse,这之前当然需要重新设置环境变量,顺手写下有关jdk.jre与jvm的区别与联系以供交流参考. 首先来说一下JD ...
- hdu 5461 Largest Point
Thinking about it: 对于式子 a * ti * ti + b * tj,可以看作时有两部分构成 a * ti * ti 和 b * tj,如果整个式子要最大,则要求这两部分都要尽量大 ...
- jquery $.ajax $.get $.post的区别
$.ajax 是 jQuery 底层 AJAX 实现,$.ajax是一种通用的底层封装,$.ajax()请求数据之后,则需要使用回调函数,有beforeSend.error.dataFilter.su ...
- 四核网络机顶盒芯片局势分析(开放市场):rk3128将会成为四核主流
开放市场:不包含小米.乐视等大品牌闭环生态系统的市场. 今年四核网络播放器以全志的a31s独领风骚.英菲克以绝对优势率先各大白牌品牌公司.只是随着时间的推移,全志的a31s不适应市场主流.因为芯片没有 ...
- Poj 3517 And Then There Was One(约瑟夫环变形)
简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个 ...
- video标签 拖动 转自w3school
调整视频大小 播放 暂停 用js实现 详细参见http://www.w3school.com.cn/tiy/t.asp?f=html5_video_dom 图片的拖动详见http://www.w3sc ...
- 判断两个XML文件结构与内容是否相同
1. 引入 目前公司的这款软件导入导出数据库信息的方法是:组织数据的内容和结构 利用MS com的sax解析 储存数据为XML格式 优点是可以选择部分导出 缺点是速度慢文件导出的文件庞大,若客户出现 ...