Perl布尔、否定(以及如何解释)?
我是新来的。在阅读了如何提问和格式之后,我希望这是一个可以回答的问题。我对perl不是很熟练,但它是我最熟悉的编程语言 我试图将Perl应用到现实生活中,但并没有得到很好的理解,尤其是我妻子。我告诉她: 如果她晚上没有给我带来3瓶啤酒,那就意味着我没有得到任何啤酒 正如你可能猜到的,没有多少成功( 现在,事实上,来自: 一元“!”执行逻辑否定,即“非” 语言,具有Perl布尔、否定(以及如何解释)?,perl,Perl,我是新来的。在阅读了如何提问和格式之后,我希望这是一个可以回答的问题。我对perl不是很熟练,但它是我最熟悉的编程语言 我试图将Perl应用到现实生活中,但并没有得到很好的理解,尤其是我妻子。我告诉她: 如果她晚上没有给我带来3瓶啤酒,那就意味着我没有得到任何啤酒 正如你可能猜到的,没有多少成功( 现在,事实上,来自: 一元“!”执行逻辑否定,即“非” 语言,具有boolean类型的(只能有两个“值”)可以: 如果不是一个值->必须是另一个值 自然地: !true -> false !f
boolean
类型的(只能有两个“值”)可以:
如果不是一个值->必须是另一个值
自然地:
!true -> false
!false -> true
但是perl没有布尔值
变量-只有一个真值系统
,而不是0
,'0'
未定义
,'
是真的。当对非逻辑值(例如数字)应用逻辑求反时,问题就来了
例如,如果某个数字不是3,这意味着它是零或空的,而不是现实生活中的意义,如果某个数字不是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, "<";
不是4的是1,而不是4
与妻子的上述陈述是“错误的”(平均值为0):),但真的试图教我的儿子Perl,过了一会儿,他问我妻子:为什么,如果某个东西不是3,那么它就是0
因此,问题是:
- 如何向我儿子解释
- 为什么perl有这种设计,为什么
每次都是1!0
- 这里有什么比
更需要的东西吗!0不是任何随机数,而是0
- 正如我已经说过的,我不太懂其他语言——在每种语言中都是
!3==0
- 正如我已经说过的,我不太懂其他语言——每种语言都是如此!3==0
- 对。在C语言中(也就是C++),情况是一样的
印刷品(见)void main() { int i = 3; int n = !i; int nn = !n; printf("!3=%i ; !!3=%i\n", n, nn); }
- 如何向我儿子解释
- 很简单<代码>!3表示“与某些非假值相反,这当然是假的”。这被称为“上下文”——在一个由否定运算符施加的布尔上下文中,“3”不是一个数字,它是一个真/假语句
结果也不是一个“零”,而仅仅是一个方便的伪Perl表示法——如果在数字上下文中使用,它会变成零(但是如果在字符串上下文中使用,则变成空字符串——请参见
和0+!3
)之间的区别) 布尔上下文只是一种特殊的标量上下文,在这种上下文中,不会执行到字符串或数字的转换。()!3.“a”
- 为什么perl有这种设计,为什么!0代表每次1
- 见上文。在其他可能的原因中(虽然我不知道这是否是Larry的主要原因),C具有相同的逻辑,Perl从C中获取了很多语法和思想 有关非常好的底层技术细节,请参见此处的答案:“和此处:”
- 这是什么“背后”比什么要求!0不是任何随机数,而是0
- 除了实现的简单性之外,什么都没有。生成“1”比生成随机数更容易
- 如果你问了一个不同的问题“为什么是1而不是原始的#被否定而得到0”,答案很简单-当Perl解释器否定这个零时,它不再知道/记住零是“!3”的结果与导致值为0/false的其他表达式相反
my_variable != 3;
使用语法
!3
,自
是一个布尔运算符,首先将3
转换为布尔值(即使perl
可能没有正式的布尔类型,它仍然以这种方式工作),因为它是非零的,这意味着它被转换为与true
等效的值。然后,!true
产生false
,当转换回整数上下文时,得到0
。继续使用该逻辑将显示!!3
将3
转换为true
,然后将其反转为false
,再次反转为true
,如果在整数上下文中使用此值,则转换为1
。大多数现代编程语言都是如此(虽然可能不是一些更以逻辑为中心的编程语言),尽管确切的语法可能会因语言而异……我认为您关注的是否定,而对Perl布尔值的含义关注得太少了
历史/实施视角
什么是真理?检测到高于x伏的更高电压
在更高的抽象级别上:如果这里设置了这个位
位序列的抽象可以被认为是一个整数。这个整数是假的吗?是,如果未设置位,即整数为零
面向硬件的语言可能会使用这种真理定义,例如C,以及所有C后代(包括Perl)
0
的求反可以是按位求反所有位都翻转到1
-,或者我们只是将最后一位设置为1
。结果通常分别被解码为整数-1
和1
,但后者更节能
语用学视角
想所有的数字都很方便
void main() {
int i = 3;
int n = !i;
int nn = !n;
printf("!3=%i ; !!3=%i\n", n, nn);
}
!3=0 ; !!3=1
my_variable != 3;
my $wordcount = ...;
if ($wordcount) {
say "We found $wordcount words";
} else {
say "There were no words";
}
say "The array is empty" unless @array; # notice scalar context
¬(x ≤ y) where x = 2, y = 3
my $beers = ...;
if (not $beers) {
say "Another one!";
} else {
say "Aaah, this is good.";
}
my $enough_beer = !! $beers;
my $enough_beer = ($beers >= 3);
my $not_enough_beer = not($beers >= 3);
my $not_enough_beer = not $beers;
fetch_beer() if $not_enough_beer;
4 != 3 # four is not equal to three
not( 4 == 3 ) # the same
foo if defined $x and length($x) > 0 and $x != 0;