我有以下脚本:
#!/usr/bin/perl
use warnings;
use strict;
my $count = 0;
my ( @first , @second , @third );
while ($count <= 7){
push ( @first , $count);
push ( @second , $count) if defined $count;
push ( @third , $count) if $count;
$count++;
}
print "first: @first\n";
print "second: @second\n";
print "third: @third\n";
这会产生以下输出:
first: 0 1 2 3 4 5 6 7
second: 0 1 2 3 4 5 6 7
third: 1 2 3 4 5 6 7
将if defined $count
与if $count
放在一起有什么区别,除了后一种方法不会将零添加到数组中?我搜索了perldocs但找不到答案。
答案 0 :(得分:26)
Truth and Falsehood in perlsyn解释了在布尔上下文中哪些值被视为false:
数字0,字符串
'0'
和''
, 空列表()
和undef
是 布尔上下文中的所有false。所有其他值都是真的。
undef
是从未初始化(或已使用undef
function重置的变量)的值。如果表达式的值不是undef
,则defined
function返回true。
if $count
是数字0,字符串$count
,空字符串'0'
或已经overloaded的对象,则 undef
为false在布尔上下文中使用时返回其中一个东西。否则,这是真的。 (空列表不能存储在标量变量中。)
if defined $count
为$count
时 undef
才为假。
答案 1 :(得分:5)
如果你在perldoc中看到defined的文档,那么你会发现
返回一个布尔值告诉 EXPR是否具有其他值 比未定义的值undef。如果EXPR不存在,$ _是 检查。
一个简单的布尔测试不会 区分undef,零, 空字符串,“0”,这些都是 同样错误。
这意味着,
push ( @second , 'undef') if defined $count;
$count = 0
时,定义因为0
与undef
不同而已定义返回true,但在这种情况下push ( @third , 'undef') if $count;
{ {1}}失败,这就是它没有将0推入数组的原因。
答案 2 :(得分:3)
if
决定通过查看你给它的表达式的值来运行它的块(或单个语句):
if( EXPR ) { ... }
如果该表达式为true,则运行其块。如果该表达式为false,则表示不是。
这个表达可以是任何事情。 Perl计算表达式,将其减少到true或false的值。然后if()
会查看该值。
因此,删除问题的这一部分,你会留下“defined $count
和$count
之间的区别”。好吧,一个是defined的返回值,另一个是$count
中存储的值。
当您想要弄清楚特定代码的作用时,请在同一个perl
的逻辑进程中逐步减少它。了解每个步骤的作用,您通常可以回答自己的问题。 :)
你说你搜索了文档,但我不确定你在哪里看。如果您想查找内置函数,可以使用perldoc的-f
开关:
$ perldoc -f defined
如果您想阅读有关if
等内容的Perl语法,请参阅perlsyn中的内容。
我有Perl documentation documentation中的Perl文档的初学者指南。
答案 3 :(得分:2)
defined
谓词测试是否完全定义变量(在这种情况下为$count
)。在你编写的代码中,它总是会在循环中定义,因为它总是有一些价值。
如果您要添加:
undef $count;
push ( @first , 'undef');
push ( @second , 'undef') if defined $count;
push ( @third , 'undef') if $count;
循环之后,你会看到差异。 (请注意,我更改了代码以添加文字'undef'
而不是$count
,因为添加实际undef
值会产生误导效果。
答案 4 :(得分:0)
与任何fule kno一样,“数字0,字符串'0'和'',空列表()和undef”不应等于false,因为它们本质上不是布尔值。编写依赖于这种变态的代码虽然技术上是正确的,但却是误导性的,应该强烈建议不要这样做。杂草和娘娘腔也应该如此。
答案 5 :(得分:-1)
我读它的方式。
if $count
仅在$count
评估!= 0
时才为真,因此第三个数组中没有0
。
if defined $count
检查$count
是否已创建标量,并且您有$count
标量,它与第一个标量相同。