在Perl中,“if defined $ count”和“if $ count”之间有什么区别?

时间:2010-10-11 03:55:23

标签: perl

我有以下脚本:

#!/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 $countif $count放在一起有什么区别,除了后一种方法不会将零添加到数组中?我搜索了perldocs但找不到答案。

6 个答案:

答案 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时,定义因为0undef不同而已定义返回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标量,它与第一个标量相同。