perl如何强制布尔值为0/1

perl如何强制布尔值为0/1,perl,Perl,我试图在真/假的值中获取0或1。代码如下: use strict; my %h = (Y => "y"); my $bool_x = 1 & exists $h{X}; my $bool_y = 1 & exists $h{Y}; print("x $bool_x y $bool_y\n"); 我需要添加“1&”,以强制它不是空字符串。有更好的方法吗?我意识到这是perl打印假值的方式的产物,但我需要它是0而不是空字符串。最有效的方法就是: $bool || 0 你的代

我试图在真/假的值中获取0或1。代码如下:

use strict;
my %h = (Y => "y");
my $bool_x = 1 & exists $h{X};
my $bool_y = 1 & exists $h{Y};
print("x $bool_x y $bool_y\n");

我需要添加“1&”,以强制它不是空字符串。有更好的方法吗?我意识到这是perl打印假值的方式的产物,但我需要它是0而不是空字符串。

最有效的方法就是:

$bool || 0

你的代码很不清楚。
&
运算符是一种按位运算符,它在数字和字符串上的行为不同,但
存在
根据需要返回一个值,该值将强制为数字零或空字符串。有这样的说法吗

虽然当前未引发警告,但当对既不是数字(请参见整数算术)也不是位字符串(请参见位字符串运算符)的操作数执行此操作时,结果未得到很好的定义

因此,由于
的结果存在
就是这样一个值,所以您的代码是不稳定的

没有必要编写一些晦涩难懂的东西,如果您想用一对不同的值来表示Perl的内部真值和假值,那么条件运算符是正确的选择

my $bool_x = exists $h{X} ? 1 : 0
我相信这是最具可读性且不冗长的,这就是这里最重要的。它也适用于您可能选择的任何其他值对,例如

my $bool_x = exists $h{X} ? 'Y' : 'N'
有许多方法可以“numify”真/假值

如果
$var
可以包含1或任何假值,所有这些值都将计算为“0”或“1”:

$var
可以包含任何真值或假值时,这些构造返回0/1值:

0 + !!$var      ( !! true => 1, !! false => "" )
1 - !$var
$var ? 1 : 0

false值为0和空字符串。您可能需要它是
'0'
:)是的。我需要把它转换成一个真正的零。这感觉有点像XY问题。为什么这里需要数字?我正在将数值存储到数据库中。因此,我需要从Exist的结果中得到一个真正的0/1。我真的怀疑,任何现实的解决方案都是如此低效,以至于对任何人都很重要。程序员的效率和可读性至关重要here@Borodin然后就变成了品味的问题。我会选择
$bool?“1':“0”
是将布尔值转换为0或1字符串的最简单方法。但是很多都是三元的,我不喜欢三元的,因为我不想加一个if。也许很傻,但我喜欢这方面的直接数学运算。这对于OP来说已经足够了,因为mob在回复中称之为“numification”,但是如果有人在这个问题中搜索,或者从google这里搜索,而不是相反,从数字中搜索布尔值,类似于php中的类型/布尔值转换,这是我需要的,暴民回答的第二部分
0+$var
,或此矿山建议
($val!=0)*1
工作$var似乎无法独立工作。那么,如果你只是想添加0+,为什么还要麻烦呢?我不理解你的问题。我只是搞砸了,这就是为什么它没有意义。我在玩!!存在($h{X}),但您的示例使用$变压阀$var将其转换为一个反向布尔值,然后转换为原始布尔变量。所以你需要这个!!进行转换。Exists已经是布尔值,因此!!我什么也没做。很抱歉给你带来困惑。@mob:虽然有很多方法可以做到这一点,但OP会问“有没有更好的方法可以做到这一点?”我认为恶作剧画廊并不能回答这个问题。底线建议不合适吗?@kdubs:我想你误解了Perl如何处理布尔测试。Perl认为有些值是true或false,有些特殊的内部值是Perl在返回true或false值时使用的。没有这样的布尔值。像
$A&&$b
这样的构造将根据其值计算为
$A
$b
之一,而不是任何神奇的布尔类型。我想如果你能解释一下为什么要这样做可能会很有用,因为我能想到的唯一原因是你需要这些值以一种特定的方式在外部表示,所以布尔值返回的值不适合算术运算?我避免使用三元,因为我不想添加if。也许很傻,但这只是我对事物的看法。@kdubs:这是一个非常奇怪的选择,特别是当你处理非数值布尔数据时,它的行为在Perl中与未定义的一样好,在大多数语言中是不可能的
0 + !!$var      ( !! true => 1, !! false => "" )
1 - !$var
$var ? 1 : 0