【发布时间】:2019-05-29 09:28:55
【问题描述】:
我的 Perl 5.26.2 x64 (Cygwin) 的经验行为是,当且仅当其 string 部分为真时,对偶变量才是真:
# Falsy number, truthy string => truthy
$ perl -MScalar::Util=dualvar -E 'my $v=dualvar 0, "foo"; say "yes" if $v'
yes
# Truthy number, falsy string => falsy
$ perl -MScalar::Util=dualvar -E 'my $v=dualvar 1, ""; say "yes" if $v'
# Truthy number, truthy string => truthy
$ perl -MScalar::Util=dualvar -E 'my $v=dualvar 1, "foo"; say "yes" if $v'
yes
# Falsy number, falsy string => falsy
$ perl -MScalar::Util=dualvar -E 'my $v=dualvar 0, ""; say "yes" if $v'
this 自 2009 年以来就是这种情况。
问题:这是有保证的行为吗?
Boolean::String说这是行为。但是,就向后兼容性而言,我不知道这是否是我可以依赖的。 我也没有在perlsyn、Scalar::Util或perldata#Context中看到明确的声明。-
我确实在
perldata#Scalar-values中看到了以下内容:如果标量值未定义、空字符串或数字 0(或其等效字符串“0”),则标量值在布尔意义上被解释为 FALSE,如果是其他值,则被解释为 TRUE。布尔上下文只是一种特殊的标量上下文,它不会执行到字符串或数字的转换。
不幸的是,“从未执行任何转换......”的声明并没有告诉我解释器正在查看的 dualvar 的哪个部分!
-
同样,查斯。欧文斯的related answer 说
真实性测试首先查看字符串
但是如果它查看字符串first,它会查看second什么,什么时候?
编辑我的理解是,如果overload 定义在变量上,无论是否为双变量,bool 重载将控制。我想知道非重载的情况。
编辑 2 ikegami 的回答 here 指出 PL_sv_yes 和 PL_sv_no 也 有一个 NV (double) 组件。对于奖励积分:),如果双变量有 NV 对真实性有任何影响吗? (让我知道该答案是否真的涉及到足以值得单独提出一个问题。)
【问题讨论】:
-
这是我记得看过的最好的研究问题。
-
@zdim 感谢您的回答和赞美!
标签: perl language-lawyer boolean-expression truthiness