刚学习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关键字的用法和区别的更多相关文章

  1. [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long

    这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...

  2. [置顶] ios 网页中图片点击放大效果demo

    demo功能:点击网页中的图片,图片放大效果的demo.iphone6.1 测试通过. demo说明:通过webview的委托事件shouldStartLoadWithRequest来实现. demo ...

  3. [置顶] mysql中的set和enum类型的用法和区别

    mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值,  不同的是set可以取多个值,enum只能取一个值.   CREATE TABLE `20121101_t` ( ...

  4. [置顶] ASP.Net中服务器控件的生命周期

    (1)初始化:在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置;二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重 ...

  5. [置顶] ios App 中嵌入应用商店

    昨晚同事拿了一个app 发现其app 内部页面打开了appstore 并没有唤起手机自带的appstore, 刚开始以为是用webview 加载的 ,可是自己些了一个demo 发现并不是那样一回事 用 ...

  6. [置顶] Android4.0中修改挂断键(ENDCALL)的默认行为

    文件: frameworks/base/core/java/android/provider/Setings.java public static final String END_BUTTON_BE ...

  7. [置顶] 在js中如何实现方法重载?以及函数的参数问题

    都知道在js中没有办法直接实现方法重载,因为在js中如果定义了多个名称相同,但参数个数不一样的方法,其实只有最后一个方法能被真正调用,其他的方法都被覆盖掉了. 但每一个函数都有一个特殊的参数argum ...

  8. [置顶] Xamarin android中使用signalr实现即时通讯

    前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你 ...

  9. 【转】[置顶] 在Android中显示GIF动画

    gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

随机推荐

  1. Oracle树反向查询的优化(转载)

    本文系转载,http://technology.amis.nl/2005/08/11/selecting-a-pruned-tree-with-selected-nodes-and-all-their ...

  2. 标准模板库——IO库

    IO库设施: . istream(输入流)类型,提供输入操作. . ostream(输出流)类型,提供输出操作. . cin,一个istream对象,从标准输入读取数据. . cout,一个ostre ...

  3. USACO Section 3.3 Camlot(BFS)

    BFS.先算出棋盘上每个点到各个点knight需要的步数:然后枚举所有点,其中再枚举king是自己到的还是knight带它去的(假如是knight带它的,枚举king周围的2格(网上都这么说,似乎是个 ...

  4. Qt保证只有一个实例(将CreateMutex得到的handle通过转换得到值)

    使用CreateMutex 可以实现只启动一个应用程序实例 view plaincopy to clipboardprint?#include <QApplication>#include ...

  5. css 自适应布局阮一峰

    转载一篇文章: 自适应网页设计(Responsive Web Design) 作者: 阮一峰 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小 ...

  6. Codeforces Round#344

    A题意思是,给出两个数列,求一个区间,使第一个数列的区间或和第二个数列的区间或的和最大,输出最大和 很显然,或运算会使得答案越运算越大.所以,直接全部或起来,相加就是答案. = =打cf的时候自动脑补 ...

  7. NYOJ 527 AC_mm玩dota

    AC_mm玩dota 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏.某天AC_mm来到了VS平台上 ...

  8. Highlighting an element as it is hovered over (like inspect element in FireBug) - jQuery Forum

    Highlighting an element as it is hovered over (like inspect element in FireBug) - jQuery Forum Highl ...

  9. Javascript高级程序设计学习笔记一

    看完w3school的javascript的概念,有点基础,开始红皮书的路程,今晚总结前二章的心得. 第一章:javascript简介 重点是javascript的实现是由 ECMAScript(核心 ...

  10. Cocos2d-x:环境配置小节

    一.准备 须要下载下面内容. 1. vs2010 下载地址:http://download.microsoft.com/download/1/4/3/143B7583-6225-474F-88D5-5 ...