What does !! (double exclamation point) mean?
在下面的代码中,从一篇别名为的博客文章中,我注意到了双感叹号!!的用法。我想知道这意味着什么,将来我可以到哪里去寻找这种Perl语法的解释。(是的,我已经在Perlsyn上搜索了!!)。
1 2 3 4 5 6 7 8 9 10 11 12 13
| package Foo ;
use vars qw{$DEBUG};
BEGIN {
$DEBUG = 0 unless defined $DEBUG;
}
use constant DEBUG => !! $DEBUG;
sub foo {
debug ('In sub foo') if DEBUG ;
...
} |
更新谢谢你的回答。
这是我刚发现的与壁球操作员名单有关的其他东西。
- 如果您认为!!是一个有趣的操作符,那么可以在for循环中试用-->操作符。:)
- Ether,你能发布一个指向-->操作员的链接吗?我不知道如何在谷歌上找到它。
- @地理:给你(你会笑的,别恨我):stackoverflow.com/questions/1642028/…
- 令人惊叹的!我不知道C有Lolcat操作员:)
它只是两个!布尔值,而不是相邻的运算符。
使用这个习语的原因是为了确保您收到一个1或0。实际上,它返回一个空字符串,数值为0。不过,它通常只在数字或布尔上下文中使用。
你会经常在代码高尔夫比赛中看到这一点,因为它比使用三元? :operator with 1and 0($test ? 1 : 0).。
1 2 3 4 5 6 7 8 9 10 11
| !! undef == 0
!! 0 == 0
!! 1 == 1
!! $obj == 1
!! 100 == 1
undef ? 1 : 0 == 0
0 ? 1 : 0 == 0
1 ? 1 : 0 == 1
$obj ? 1 : 0 == 1
100 ? 1 : 0 == 1 |
- 实际上,我在代码中经常使用!!!!,因为!!混淆了vim的语法突出显示,另一个!!将恢复它!
- @很明显,你需要使用Emacs。:)
- 它产生1或规范错误值,而不是0。在数字上下文中是0,但在字符串上下文中是空字符串。要获得0或1,请使用1-!运算符:)
- @布拉德:1为了引起你对Yth评论的注意,修复后将撤销。
- 作为编写相同代码的人,它就在那里,因为我希望在编译时将该变量中的任何奇怪之处规范化。这只是一种质量保护机制。
- @布拉德谢谢你的回答。我刚开始读半音的新书草稿,我喜欢他怎么说!!"强制Boelean上下文"。
- perl5Maven.com/boolean-values-in-perl
不是。
它将该值转换为布尔值(或者在Perl接近该值时转换为布尔值)。
- 它也是其他语言(如javascript)中常见的习惯用法。
- @多沃德,谢谢你的回答!
因为其他三个答案声称范围是"0"或"1",我只是想提到Perl中的布尔值(由==、not等运算符返回)是undef和1,而不是0和1。
- 这是不正确的。当一个运算符必须生成一个假值时,它使用一个魔力值,该值在字符串上下文中计算为空字符串,在数字上下文中计算为0。(例外是像and和or这样的运算符,它们只返回导致它们返回false的操作数。)(参见perldoc.perl.org/perlsyn.html真与假)
- undef也是一个魔力值,在字符串上下文中计算为"",在数字上下文中计算为0——唯一的区别是,当启用警告时,对其字符串或数字值使用undef很容易产生警告,而"false value"则不产生警告;)
- @霍布斯:另一个区别是,defined(undef)是假的,但defined(1==2)是真的。
- 实际上,它返回一个零长度的字符串。
- +1你显然对其他答案有影响。布拉德修改了你的答案。另外,至少有一个你提到的答案最终也被删除了。
- @分子事实上我根据Yth的评论修改了我的答案。