在标量(布尔)上下文中1
计算表达式时,如果表达式求值为true ,则Perl使用显式值作为结果;如果表达式求值为false,则使用空字符串.我很好奇为什么Perl使用空字符串来表示布尔值false而不是0
更直观.
请注意,我并不关心Perl将空字符串视为标量(布尔)上下文中的false.
编辑
如何使用true("false"
例如)字符串作为false值的字符串表示来改变现有代码的含义?我们可以说在这样的改变之后改变语义的代码不像它本来那样健壮/正确吗?我猜字符串上下文在Perl中是如此普遍,以至于导致理智语义的唯一选择是,如果布尔值在向字符串转换为字符串之后保留其值...
我正在寻找在Perl中表达这个Python片段的方法:
data = {"A": None, "B": "yes", "C": None}
key_list = [k for k in data if data[k]]
# in this case the same as filter(lambda k: data[k], data) but let's ignore that
Run Code Online (Sandbox Code Playgroud)
所以从一个方面来看,我只想要值为None或undef的键.从另一个角度来看,我想要的是简洁的perl相当于有条件的列表理解.
这是一段常见的示例代码:
while (1) {
print "foo\n";
}
Run Code Online (Sandbox Code Playgroud)
永远打印'foo'.
perl foo.pl
foo
foo
foo
...
Run Code Online (Sandbox Code Playgroud)
和
while (0) { print "foo\n"; }
Run Code Online (Sandbox Code Playgroud)
像你期望的那样安静地死去:
perl test.pl
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么这是一个有用的实现吗?这至少适用于5.10,Unix和MacOS X:
while (-1) { print "foo\n"; }
Run Code Online (Sandbox Code Playgroud)
这使
foo
foo
foo
...
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在Perl中使用布尔变量?
[root@ ~]$ perl -e 'if(true){print 1}'
1
[root@ ~]$ perl -e 'if(false){print 1}'
1
Run Code Online (Sandbox Code Playgroud)
我很震惊,true
并且false
通过if
......
我来自C++背景,我正在尝试使用Beginning Perl学习perl.但是,第二章中的这段代码让我感到困惑:
#!/usr/bin/perl
use warnings;
print"Is two equal to four? ", 2 == 4, "\n";
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,这是输出:
Is two equal to four?
Run Code Online (Sandbox Code Playgroud)
下面进一步解释,2 == 4的值是未定义的,但这对我来说似乎令人困惑和反直觉.两个显然不等于四,4和4之间的相同比较将产生真,导致输出结束时为'1'.为什么表达式不返回false?
请帮助我理解以下片段:
my $count = @array;
my @copy = @array;
my ($first) = @array;
(my $copy = $str) =~ s/\\/\\\\/g;
my ($x) = f() or die;
my $count = () = f();
print($x = $y);
print(@x = @y);
if ( $2 && $3 && $3 != 0 )
Run Code Online (Sandbox Code Playgroud)
Perl中的上述逻辑是什么?在其他语言中,我从未见过像这样的if条件.2美元和3美元只是捕获一些正则表达式的组.
或这个:
if ( $2 && $2 == 0 && $3 && $3 == 0 )
Run Code Online (Sandbox Code Playgroud) 我有一些Perl代码正在做一些奇怪的事情,我无法弄清楚.我在这段代码之前定义了两个变量:
$latestPatch = '000';
$test_setup{appl}{Rev0_OK} = 'F'; # a hash element
Run Code Online (Sandbox Code Playgroud)
两者都被定义为字符串.如果我打印出原始变量(包裹它们),'int($latestPatch)'
是'0'
和'$test_setup{appl}{Rev0_OK}'
是'F'
.到目前为止,正如所料.现在我运行以下内容:
$shouldInstall = int($latestPatch) == 0 &&
$test_setup{appl}{Rev0_OK} eq 'T';
Run Code Online (Sandbox Code Playgroud)
$shouldInstall
最终得到一个空值(false/0预期)!(打印'$shouldInstall'
给'').逐步调试语句(未显示)表明int($latestPatch) == 0
工作正常,给出1(TRUE),但是$test_setup{appl}{Rev0_OK} eq 'T'
为''(因此$shouldInstall
是'').如果我将测试更改为$test_setup{appl}{Rev0_OK} eq 'F'
,则为1(TRUE).如果我将测试更改为$test_setup{appl}{Rev0_OK} ne 'F'
,则它再次为空.这里发生了什么?没有发出错误消息.我确实有布尔变量TRUE和FALSE(如int 1和0).
aTdHvAaNnKcSe
下面的perl one-liner输出hello to console,那么如何解释这里的错误,因为它不是变量或文字字符串?
perl -e"if (false) {print 'hello'}"
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下这是什么,如果检查和何时通过?
if ( $rate_minimum || 0 ) > ( (4 * $rate_max_min) // 120 ):
Run Code Online (Sandbox Code Playgroud)
抱歉没有成为perl开发人员