【发布时间】:2013-07-03 16:22:44
【问题描述】:
我是新来的。在阅读了如何提问和格式化之后,我希望这是一个可以的问题。我对 perl 不是很熟练,但它是我最了解的编程语言。
我尝试将 Perl 应用到现实生活中,但我没有得到很好的理解——尤其是我妻子的理解。我告诉她:
如果她晚上没有给我带来 3 瓶啤酒,那意味着我得到零(或没有) 瓶啤酒。
正如您可能猜到的那样,没有取得多大成功。 :(
现在事实上。来自perlop:
一元“!”执行逻辑否定,即“非”。
语言,boolean 类型(只能有两个“值”)是可以的:
如果不是一个值 -> 必须是另一个。
很自然:
!true -> false
!false -> true
但是 perl 没有 boolean 变量 - 只有一个 truth system,而所有的东西都不是 0,'0' undef,'' 是 TRUE。问题来了,当将 逻辑否定 应用于 非逻辑值 例如数字。
例如如果某个数字 IS NOT 3,那就意味着它 IS ZERO 或为空,而不是 现实生活 的意思,如果某物不是 3,表示它可以是 除 3 以外的任何值(例如,也可以是零)。
所以接下来的代码:
use 5.014;
use Strictures;
my $not_3beers = !3;
say defined($not_3beers) ? "defined, value>$not_3beers<" : "undefined";
say $not_3beers ? "TRUE" : "FALSE";
my $not_4beers = !4;
printf qq{What is not 3 nor 4 mean: They're same value: %d!\n}, $not_3beers if( $not_3beers == $not_4beers );
say qq(What is not 3 nor 4 mean: @{[ $not_3beers ? "some bears" : "no bears" ]}!) if( $not_3beers eq $not_4beers );
say ' $not_3beers>', $not_3beers, "<";
say '-$not_3beers>', -$not_3beers, "<";
say '+$not_3beers>', -$not_3beers, "<";
打印:
defined, value><
FALSE
What is not 3 nor 4 mean: They're same value: 0!
What is not 3 nor 4 mean: no bears!
$not_3beers><
-$not_3beers>0<
+$not_3beers>0<
此外:
perl -E 'say !!4'
什么是不是4是1,而不是4!
上面对妻子的陈述是“错误的”(意思是 0):),但是 真的想教我儿子 Perl,过了一会儿,他问我妻子:为什么,如果有些东西不是 3 意味着它是 0 吗? .
所以问题是:
- 如何向我儿子解释这一点
- 为什么perl有这个设计,那么为什么
!0每次都是1 - 这里有什么“背后”的东西比
!0需要的不是任何随机数,而是0。 - 正如我已经说过的,我不太了解其他语言 - 在每种语言中都是
!3 == 0?
【问题讨论】:
-
我觉得这里试图提出一些深刻的论点我只是看不出它是什么。
-
要和我的妻子和啤酒一起尝试 perl 的逻辑 :)
-
我没有喝过三杯啤酒。这是否意味着我已经喝了四瓶啤酒?
-
可能你的妻子使用了重载的
!运算符。 :) 检查overload::Overloaded $beer。 -
!运算符适用于布尔值。表达式!3是!(3 != 0)的简写,括号中的表达式表示被否定的隐式布尔值。因为(3 != 0)为真或1,它的否定为0 或假。这就是为什么!3 == !4。
标签: perl