zoukankan      html  css  js  c++  java
  • [置顶] 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()完全相同。

  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3293912.html
Copyright © 2011-2022 走看看