如何在Perl中使用布尔变量?

Cha*_*hon 218 perl boolean

我试过了:

$var = false;
$var = FALSE;
$var = False;
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.我收到错误消息

Bareword "false" not allowed while "strict subs" is in use.

Ala*_*avi 282

在Perl中,以下在条件语句中评估为false:

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')
Run Code Online (Sandbox Code Playgroud)

其余的都是如此.没有裸言语truefalse.

  • 我可以因为没有布尔人而投票给perl吗? (99认同)
  • @eternicode,Perl在需要返回true和false时确实有两个特定的值,所以它不仅有布尔值,它有真(`!0`又叫'PL_sv_yes`)和false(`!1`又名` PL_sv_no`).或者你是说Perl应该在除了这两个值以外的东西被测试真实性时呱呱叫?那太糟糕了.例如,它会阻止`$ x || = $ default;` (15认同)
  • 问题1:空列表不是假的,因为无法检查列表是真还是假.标量上下文中的空列表返回`undef`. (8认同)
  • 问题3:具有重载布尔运算符的对象也可能为false. (6认同)
  • 问题2:`('')`和`''`是相同的值.我想你想暗示一个包含空字符串的元素的列表(即使parens不创建列表),但正如我已经提到的,不可能检查列表是否为false. (4认同)
  • @Robert Harvey:`perl -le'我的$ var = 0; 打印"False"除非($ var);'` (2认同)
  • @BlueWaldo:在比较并将比较结果分配给标量时,也可以使用cmp和<=>。$ var = $ var1 cmp $ var2; 如果左参数小于,等于或大于右参数,则'cmp'和'<=>'(用于数字比较)将返回-1、0或1。它不是布尔值,但有时您可能想知道一个参数ir是否等于或小于另一个参数,而不是等于或不等于。 (2认同)
  • 这是关于时间perl有关键字true和false虽然.它只会增加学习perl或在语言之间切换时的困惑,就像我做了很多事情一样.我猜这里有http://search.cpan.org/dist/Keyword-Boolean-0.001/lib/Keyword/Boolean.pm但我懒得安装它.虽然我正在咆哮"elseif","如果声明"在一条线上,而不必有括号等等! (2认同)
  • @abhi divkar,它没有使用优化;使用它是因为它更简单、更清晰。考虑一下当您有大量初始化时,或者如果您处于较大语句的中间(例如 `f({ foo => $foo // "foo", ... })`),会发生什么情况。当 LHS 很复杂或有副作用时(例如 `f( Something_long_or_expense() // Something_else() );`),它的价值绝对是无价的。复杂性的节省是*令人难以置信的*。它确实将程序的长度缩短了三分之一。即使您必须*一次*花 20 分钟来学习这一点,也是值得的。 (2认同)

ike*_*ami 70

我遇到的最完整,最简洁的错误定义是:

字符串化为空字符串或字符串"0"的任何内容都是false.其他一切都是真的.

因此,以下值为false:

  • 空字符串
  • 数值为零
  • 未定义的值
  • 具有重载布尔运算符的对象,用于计算上述其中一个.
  • 一个神奇的变量,在上面的fetch中评估其中一个.

请记住,空列表文字在标量上下文中求值为未定义的值,因此它的计算结果为false.


关于"真零"的说明

虽然字符串化的数字0是假的,但数字为零的字符串不一定.唯一的假字符串是0空字符串.任何其他字符串,即使它编号为零,也是如此.

以下是作为布尔值为真的字符串,以及作为数字的零.

  • 没有警告:
    • "0.0"
    • "0E0"
    • "00"
    • "+0"
    • "-0"
    • " 0"
    • "0\n"
    • ".0"
    • "0."
    • "0 but true"
    • "\t00"
    • "\n0e1"
    • "+0.e-9"
  • 带警告:
    • 任何Scalar::Util::looks_like_number返回false的字符串.(例如"abc")

  • 您的“简洁”定义与您的较长解释不一致。考虑:`my $value = do { package XXX; 使用重载 q[""] => sub { "XXX" }, q[bool] => sub { 0 }; 保佑[]};`。现在 `$value` 将字符串化为“XXX”,但布尔化为 false。 (2认同)

Jam*_*son 58

Perl没有本机布尔类型,但您可以使用整数或字符串的比较来获得相同的行为.Alan的例子是使用整数比较的一种很好的方法.这是一个例子

my $boolean = 0;
if ( $boolean ) {
    print "$boolean evaluates to true\n";
} else {
    print "$boolean evaluates to false\n";
}
Run Code Online (Sandbox Code Playgroud)

我在一些程序中完成的一件事是使用常量添加相同的行为:

#!/usr/bin/perl

use strict;
use warnings;

use constant false => 0;
use constant true  => 1;

my $val1 = true;
my $val2 = false;

print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
    print " evaluates to true.\n";
} else {
    print " evaluates to false.\n";
}

print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
    print " evaluates to true.\n";
} else {
    print " evaluates to false.\n";
}
Run Code Online (Sandbox Code Playgroud)

"use constant"中标记的行定义一个名为true的常量,总是求值为1,一个名为false的常量始终求值为0.由于在Perl中定义常量的方式,以下代码行也会失败:

true = 0;
true = false;
Run Code Online (Sandbox Code Playgroud)

错误消息应该说"无法修改标量赋值中的常量".

我在其中一条关于比较字符串的评论中看到了这一点.您应该知道,因为Perl在标量变量中组合了字符串和数字类型,所以您可以使用不同的语法来比较字符串和数字:

my $var1 = "5.0";
my $var2 = "5";

print "using operator eq\n";
if ( $var1 eq $var2 ) {
    print "$var1 and $var2 are equal!\n";
} else {
    print "$var1 and $var2 are not equal!\n";
}

print "using operator ==\n";
if ( $var1 == $var2 ) {
    print "$var1 and $var2 are equal!\n";
} else {
    print "$var1 and $var2 are not equal!\n";
}
Run Code Online (Sandbox Code Playgroud)

这些运算符之间的差异是Perl中非常常见的混淆源.

  • 使用常量作为穷人的宏,这种方式很危险.这些代码示例不等同:`if($ exitstatus){exit; }`vs`if($ exitstatus == true){exit; 对于一个不经意的观察者来说,这可能并不明显.(是的,最后一个例子是糟糕的编程风格,但这不是重点). (11认同)
  • `使用警告;`而不是`#!perl -w` (4认同)

xen*_*ide 16

我推荐use boolean;.你必须从cpan 安装布尔模块.

  • 在Perl中,就像在生活中一样,有许多真理.缺乏经验的人喜欢写愚蠢的东西,比如`if($ my_true_value == true)`.根据我的经验,假装存在一个真实的真相,是一条通向痛苦和低效代码的道路. (7认同)
  • Perl天生就是哲学 (2认同)

syc*_*yck 12

我的最爱一直都是

use constant FALSE => 1==0;
use constant TRUE => not FALSE;
Run Code Online (Sandbox Code Playgroud)

这完全独立于内部表征.

  • 辉煌。您已经一手解决了Perl编程语言! (4认同)

ser*_*sat 7

我遇到了一个教程,它很好地解释了Perl中什么值是真和假的.它声明:

以下标量值被视为错误:

  • undef - 未定义的值
  • 0 数字0,即使你把它写成000或0.0
  • '' 空字符串.
  • '0' 包含单个0位的字符串.

所有其他标量值,包括以下内容均为真:

  • 1 任何非0号码
  • ' ' 带有空格的字符串
  • '00' 字符串中有两个或多个0个字符
  • "0\n" a 0后跟换行符
  • 'true'
  • 'false' 是的,即使字符串'false'评估为true.

还有另一个很好的教程可以解释Perl的真假.


Bha*_*rat 6

bobf给出的布尔值的漂亮解释:是 真还是假?快速参考指南

真理测试不同的值

                       Result of the expression when $var is:

Expression          | 1      | '0.0'  | a string | 0     | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var )          | true   | true   | true     | false | false     | false
if( defined $var )  | true   | true   | true     | true  | true      | false
if( $var eq '' )    | false  | false  | false    | false | true      | true
if( $var == 0 )     | false  | true   | true     | true  | true      | true
Run Code Online (Sandbox Code Playgroud)