[置顶] 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的展示 ...
随机推荐
- The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法:
The file “XXX” couldn’t be opened because you don’t have permission to view it.解决方法: 解决方法:直接点击Xcod ...
- 创建以及加载模块【nodejs第四篇】
建立两个文件,文件一createModule.js ,文件二main.js createModule.js的代码,主要用于创建一个模块 /** * Created by Administrator o ...
- SDOI2008 Sandy的卡片( 后缀数组 )
求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...
- 为IE6-7间接支持:before和:after伪类
:before和:after我们经常会用到,特别是在做移动端页面时,利用它制作文字前后的ICON.图片的垂直居中之类的非常方便且代码简洁(当然,功能远比这些要多的多...). 可是在PC端,由于现在还 ...
- The basic introduction to MIX language and machine
reference: The MIX Computer, The MIX Introduction sets, The basic info storage unit in MIX computer ...
- Linux 网络编程基础(2)-- 获取主机信息
前一篇已经介绍了最基本的网络数据结构.这篇介绍一下获取主机信息的函数 举个例子,想要通过代码的方式从百度获取当前的时间,怎么做?我们不知道百度的IP地址啊,这代码怎么写?还好,Linux提供了一些AP ...
- MySQL my.cnf 参数说明
MySQL 5.5.13 参数说明: [client] character-set-server = utf8 port = 3306 socket = /data/mysql/3306/my ...
- JAVA并发,经典死锁案例-哲学家就餐
转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程 ...
- QReadWriteLock上锁容忍的等待时间是多久?
非递归上锁情况下,同一个锁,已经被锁过一次,那么另外一个线程尝试上锁,会被挡在外面,但是会被挡多久呢?挡一分钟会被崩溃,还十分钟,还是永久等待而不崩溃(希望如此)?还是会立刻崩溃?因为不可以重复上锁. ...
- 使用Fiddler解析WCF RIA Service传输的数据
原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...