刚学习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. div模拟滚动条

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="html.aspx.cs&q ...

  2. Android 开发之Matrix图片处理类的使用

    在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1.Translate————平移变换 2.Scale————缩放变换 ...

  3. Hadoop学习笔记01——Hadoop分布式文件系统

    Hadoop有一个称为HDFS的分布式系统,全称为Hadoop Distributed Filesystem. HDFS有块(block)的概念,默认为64MB,HDFS上的文件被划分为块大小的多个分 ...

  4. 在JSTL EL中处理java.util.Map,及嵌套List的情况

    关联的键查找存储在映射中的值. 在方括号中指定键,并将相应的值作为表达式的值返回.例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" ...

  5. APM代码学习笔记1

    libraries目录 传感器 AP_InertialSensor 惯性导航传感器 就是陀螺仪加速计 AP_Baro 气压计 居然支持BMP085 在我印象中APM一直用高端的MS5611 AP_Co ...

  6. Dijkstra算法模拟讲解

    dijkstra算法,是一个求单源最短路径算法 其算法的特点为: 层层逼进,有点类似宽度搜索的感觉 其需要的数据结构为:                  int map[N][N] 所有点之间的权表 ...

  7. Microsoft Azure 负载平衡服务

     Microsoft Azure 为在其中托管的虚拟机(IaaS) 和云服务(PaaS) 提供负载平衡服务.负载平衡支持应用程序伸缩,并且提供应用程序故障恢复以及其他优势. 可以通过以下方式访问负 ...

  8. POJ 1700 经典过河问题(贪心)

    POJ题目链接:http://poj.org/problem?id=1700 N个人过河,船每次最多只能坐两个人,船载每个人过河的所需时间不同,问最快的过河时间. 思路: 当n=1,2,3时所需要的最 ...

  9. hdu 1394 zoj 1484 求旋转序列的逆序数(并归排序)

    题意:给出一序列,你可以循环移动它(就是把后面的一段移动到前面),问可以移动的并产生的最小逆序数. 求逆序可以用并归排序,复杂度为O(nlogn),但是如果每移动一次就求一次的话肯定会超时,网上题解都 ...

  10. AppStore被拒原因及总结

    4.5 - Apps using background location services must provide a reason that clarifies the purpose of th ...