Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl布尔、否定(以及如何解释)?_Perl - Fatal编程技术网

Perl布尔、否定(以及如何解释)?

Perl布尔、否定(以及如何解释)?,perl,Perl,我是新来的。在阅读了如何提问和格式之后,我希望这是一个可以回答的问题。我对perl不是很熟练,但它是我最熟悉的编程语言 我试图将Perl应用到现实生活中,但并没有得到很好的理解,尤其是我妻子。我告诉她: 如果她晚上没有给我带来3瓶啤酒,那就意味着我没有得到任何啤酒 正如你可能猜到的,没有多少成功( 现在,事实上,来自: 一元“!”执行逻辑否定,即“非” 语言,具有boolean类型的(只能有两个“值”)可以: 如果不是一个值->必须是另一个值 自然地: !true -> false !f

我是新来的。在阅读了如何提问和格式之后,我希望这是一个可以回答的问题。我对perl不是很熟练,但它是我最熟悉的编程语言

我试图将Perl应用到现实生活中,但并没有得到很好的理解,尤其是我妻子。我告诉她:

如果她晚上没有给我带来3瓶啤酒,那就意味着我没有得到任何啤酒

正如你可能猜到的,没有多少成功(

现在,事实上,来自:

一元“!”执行逻辑否定,即“非”

语言,具有
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有这种设计,为什么
    !0
    每次都是1
  • 这里有什么比
    更需要的东西吗!0不是任何随机数,而是0
  • 正如我已经说过的,我不太懂其他语言——在每种语言中都是
    !3==0

逻辑上否定假值需要选择一些值来表示结果真值。“1”是最好的选择。我想说返回哪个值并不重要(或者相反,重要的是不要依赖于返回的任何特定真实值)

  • 正如我已经说过的,我不太懂其他语言——每种语言都是如此!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的其他表达式相反


如果要测试数字是否不是3,请使用以下方法:

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;