有什么区别
if (defined $hash{$key}) { }

if (exists $hash{$key}) { }

我什么时候知道使用哪个?

解决方法

这在 definedexists的perldoc条目中有详细记录。下面是一个快速摘要:

defined $ hash {key}告诉你是否定义给定键的值(即不是undef)。使用它来区分未定义的值和在布尔上下文中为false的值,例如0和”。

exists $ hash {key}告诉你%hash是否包含给定的键。使用它来区分未定义的值和不存在的值。

这是最容易看到一个例子。给定这个散列:

my %hash = (a => 1,b => 0,c => undef);

这里是检索,定义和存在的结果:

# key  value  defined  exists
a          1        1       1
b          0        1       1
c      undef        0       1
d      undef        0       0

在实践中,人们经常只写if($ hash {key}){…},因为(在很多通常情况下)只有真值有意义/可能。如果false值有效,那么必须在测试中添加defined()。 exists()的使用频率更低。最常见的情况是可能在使用哈希作为集合。例如

my %set = map { $_ => undef } 'a' .. 'z';

使用undef设置值有几个好处:

>它更准确地表示意图(只有键是有意义的,而不是值)。
>所有undef值共享单个分配(这会节省内存)。
> exists()测试稍快(因为Perl不必检索值,只确定有一个)。

它也有缺点,你必须使用exists()来检查集合成员身份,这需要更多的输入,如果你忘记它会做错的事情。

另一个存在的地方是有用的是在尝试检索值之前探测锁定的哈希值(这将触发异常)。

perl – exists和defined有什么区别?的更多相关文章

  1. Swift快速入门五集合

    相关文章Swift快速入门(一)第一个Swift程序Swift快速入门(二)基本数据类型Swift快速入门(三)运算符Swift快速入门(四)流程控制前言Swift提供了数组和字典两种集合类型来存储数据,Swift的数组用来存储顺序相同类型相同的类型,字典则采用kay-value的形式存储数据。修改字典字典提供了updataValue()方法来修改字典的value值,该方法会返回一个Sting?

  2. 如何检查字符串是否包含Swift中的另一个字符串?

    在Objective-C中,检查Nsstring中的子字符串的代码是:但是我如何在Swift中这样做?你可以做与Swift完全相同的调用:我希望这是一个有用的解决方案,因为有些人,包括我,通过调用containsstring()遇到一些奇怪的问题。

  3. 快速内联条件?

    我如何在Swift这样做?(没有我没有阅读整个手册…我可能错过了第2页!)好的,所以它在第91页和以上看来是正确的。但是我试图用这样的字符串来使用它:但编译器不高兴。任何想法如果可能的话?这是我能够得到的如果你正在寻找一个单行的话,你可以把?

  4. android – 如何检查文件是否存在,如果没有在异步任务的sdcard中创建新文件

    我想从服务器下载pdf并存储在sdcard上.我尝试像下面的代码,但它不会进入其他条件,因为我没有创建一个文件,仍然会给MSG文件存在.为什么呢解决方法您可以使用File.exists()检查文件是否存在注意:exists()将为目录返回true如果你想检查一个特定的文件是否存在,你必须使用File.isFile()新文件.exists()将返回true,但不允许您作为文件打开和读取.你的代码中的问题是你的文件名是空的.编辑2:尝试这个:要么或者在AsyncTask的onPreExecute()中放置这两

  5. 不是Android File.exists()区分大小写?

    我已经创建了一个新的文件夹“sdcard/dd”:而且,我创建第二个文件夹“sdcard/DD”由相同的代码,但是,这次album.exists()返回true,这表示“dd”是等于“DD”.任何人都知道为什么File.exists()不能检查文件夹名称的大小写?解决方法虽然Linux,因此也是Android,通常在文件名时是区分大小写的,通常在SD卡,记忆棒等上使用的FAT文件系统是不区分大小写的.因此,当它处理这些文件系统上的文件时,Android将不会区分这些情况.因此,如果您有两个文件,/sdca

  6. JSP 开发之THE SERVLET NAME ALREADY EXISTS.解决方法

    这篇文章主要介绍了JSP 开发之THE SERVLET NAME ALREADY EXISTS.解决方法的相关资料,希望通过本文大家能解决这样的问题,需要的朋友可以参考下

  7. PHP与Perl之间知识点区别整理

    在本篇文章里小编给大家分享了关于PHP与Perl的却别以及相关知识点整理,有兴趣的朋友们学习下。

  8. Spring Data Exists查询最佳方法编写示例

    这篇文章主要为大家介绍了Spring Data Exists查询最佳方法编写示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. windows – 在perl中的fork实现

    我想在perl中执行子进程.我还希望我的代码与平台无关.问题是在Windows中perl实现fork,是一个伪进程,实际上是一个线程.请参阅windowshere的perlfork仿真.它还提到了在伪进程上执行kill和exec命令时出现的问题.在不同平台上使用两个不同版本的fork是否安全,还是应该使用特定于操作系统的API?

  10. windows – 如何从Perl程序中设置cmd.exe窗口的大小?

    我有一个在Windows中运行的Perl脚本,显示屏幕很长的行.我不想永久修复我的控制台大小.我只是希望它在这个脚本运行时很大.有没有办法在这个窗口内运行的Perl脚本中定义控制台的大小?您可以使用mode命令设置正在运行的控制台的控制台大小:更改将仅持续到控制台窗口关闭.

随机推荐

  1. 数组 – Perl中有什么神奇的数组?

    在Perldocumentationforreverse中,我发现:“请注意,将数组反转到自身(如@a=reverse@a)将尽可能保留不存在的元素;即对于非魔法数组或具有EXISTS和DELETE方法的绑定数组.什么属性区分神奇和非魔法阵列?解决方法一个神奇的阵列是一个执行它的操作不仅仅是改变内容.只有内置的魔术阵列是@ISA,而且这是非常不明显的.正如句子所暗示的,魔术阵列主要是一个绑定的阵列

  2. perl – 使用“isa”方法的最佳方式?

    什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

  3. 在CORE :: GLOBAL中哪些Perl内置函数不能被覆盖?

    解决方法toke.c中任何值为负的值都可以被覆盖;所有其他人可能不会.你可以看源码here.例如,我们来看看第10,396行的waitpid:由于waitpid为负数,因此可能会被覆盖.grep怎么样?这是积极的,所以不能被覆盖.这意味着以下关键字不能被覆盖:chop,defined,delete,do,dump,each,else,elsif,eval,exists,for,foreach,format,glob,goto,grep,if,keys,last,local,m,map,my,next,no

  4. 如何在Perl中打印由换行符分隔的列表元素?

    什么是最简单的打印所有列表的元素以Perl中的换行符分隔的元素?解决方法在Perl5.10中:其他方式:或:或者怎么样?

  5. 使用Perl如何获取文件大小(以兆字节为单位)?

    我想以磁盘的形式获取磁盘上的文件大小.使用-s运算符给出了以字节为单位的大小,但是我将假设,然后将其除以魔术数字是一个坏主意:我应该使用只读变量来定义1024,还是有一种编程方式来获取一千字节的字节数?

  6. perl – 如何测试/分类CPAN模块的utf8正确性

    例如:File::Slurp,如果你将读取该文件您将根据命令行开关获得不同的结果,并且perl-CSDA将无法正常工作.伤心.(是的,我知道比Encode::decode(“utf8”,read_file($file,binmode=>’:raw’));将帮助,但是SAD.我的问题:>在这里任何首选方式,如何测试/分类什么CPAN模块是utf8安全/准备/正确?>这里是像Perl::Criticforutf8这样的东西–什么将检查模块源可能的utf8不正确?总结以上是DEVMAX为你收集整理的perl–如

  7. 如何删除Perl字符串中的空格?

    如果我声明一个值为’3’的变量$myString.是否有任何功能来删除返回值的空格.有点像SomeFun然后返回’3′.输出:你可以注意到’vid’=>‘0’,上面的代码从theanswer.我正在研究它.总结以上是DEVMAX为你收集整理的如何删除Perl字符串中的空格?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 如何在mod_perl2下运行Devel :: Cover?

    Unfortunately,Devel::Coverdoesnotyetworkwiththreads.它也不适用于prefork.在startup.pl中使用,Devel::Cover问题perl5.8.9,Apache2.2.13.我的操作系统是FreeBSD,如果重要.同样的问题是reportedforwin32.更新:PerlTrace全部输出解决方法邪恶之源似乎是Apache::DBI.

  9. 如何使用Perl中的C类?

    我有一套用C写的课.从Perl脚本中调用它们的最佳方法是什么?

  10. perl – 在Emacs中以双模式更好的缩进

    我正在使用Emacs来修改Perl和Verilog交织的代码.我正在使用two-mode-mode在两者之间切换,这样可以预期.问题是perl代码与//一行一行地表示;如下图所示:而双模式则认识到它是Perl,它是逐行的,所以缩进等在线上无意义.我想做的是使Perl代码像往常一样格式化,但忽略//;字符.有什么想法吗?我刚刚开始偷看模式文件,它们是可以理解的复杂的,所以任何提示都不会感激!

返回
顶部