在标量(布尔)上下文中1计算表达式时,如果表达式求值为true ,则Perl使用显式值作为结果;如果表达式求值为false,则使用空字符串.我很好奇为什么Perl使用空字符串来表示布尔值false而不是0更直观.
请注意,我并不关心Perl将空字符串视为标量(布尔)上下文中的false.
编辑
如何使用true("false"例如)字符串作为false值的字符串表示来改变现有代码的含义?我们可以说在这样的改变之后改变语义的代码不像它本来那样健壮/正确吗?我猜字符串上下文在Perl中是如此普遍,以至于导致理智语义的唯一选择是,如果布尔值在向字符串转换为字符串之后保留其值...
我的Perl 5.26.2 x64(Cygwin)的经验行为是,当且仅当其字符串部分是真实时,双变量才是真实的:
# 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 …Run Code Online (Sandbox Code Playgroud) 我是新来的.在阅读了如何询问和格式化之后,我希望这将是一个好问题.我对perl不是很熟练,但它是我最熟悉的编程语言.
我尝试将Perl应用到现实生活中,但我没有得到很好的理解 - 尤其不是来自我的妻子.我告诉她:
如果她晚上没给我3杯啤酒,那就意味着我喝了零(或没有)啤酒.
你可能已经猜到了,没有太大的成功.:(
事实上,现在.来自perlop:
一元"!" 执行逻辑否定,即"不".
语言,有什么boolean类型(什么只有两个"值")是可以的:
如果它不是一个值 - > 必须是另一个值.
很自然地:
!true -> false
!false -> true
Run Code Online (Sandbox Code Playgroud)
但Perl不具有boolean变量-只有一个truth system,whrere一切都不是0,'0' undef,''为TRUE.当将逻辑否定应用于非逻辑值(例如数字)时出现问题.
例如,如果某个数字不是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 …Run Code Online (Sandbox Code Playgroud) 简短的问题
在Perl代码库中一致表示真假的最佳方法是什么?
1/ 0?
1/ Perl的本机布尔运算符
返回的特殊空字符串?
undef?
() (即空列表)?
问题背景
我们都知道Perl在布尔方面非常灵活,就像大多数事情一样.
例如,Perl将以下内容视为false:,undef()数字0(即使写为000或0.0),空字符串'0'(包含单个0位的字符串).Perl将以下作为真:任何其他的标量值,1,-1,在它(一个空格的字符串' '),'00'多个0的串,"0\n"(跟着一个新行"0"), , 'true','false','undef'等等另外,基于阵列to-scalar和list-to-scalar转换意味着你可以经常使用空数组作为假值.(感谢http://perlmaven.com/boolean-values-in-perl获取Perl接受为真或假的标量值的部分列表.)
但是考虑到所有这些被视为true或false的值,Perl布尔函数应该返回什么?
1/0-1/0 (全息)1/undef1/""如果您使用这些约定中的任何一个,您将很快发现您编写的代码的行为与普通的Perl代码不同.您将无法取代$a<$b 的custom_less_than($a,$b),并有它的工作原理完全相同.
考虑:
> perl -e 'use warnings;
sub my_eq { return ( $_[0]==$_[1] ? 1 : 0 ) }
print "compare (1==0) <<".(1==0).">>"
." to my_eq(1,0) <<".my_eq(1,0).">>" …Run Code Online (Sandbox Code Playgroud) 我的perl脚本在一个机制上工作但在另一个机制上失败.
我使用perl调试器通过在命令中添加"-d"来调试它.即"perl -d my_perl.pl".然后我发现所有"整数比较"仅适用于TRUE结果.
例如,如果我输入debug命令
"x(1 == 1)"
它返回'1'(TRUE).但是如果我输入debug命令
"x(1!= 1)"
它返回''(没有,结果预计为0(FALSE)).
顺便说一下,字符串比较是一样的.x"s"eq"s"返回'1'和x"s"eq"s"返回''.
我使用perl v5.14.2(通过perl -v获取).我的perl有什么问题?我该如何解决?