2010-10-11 101 views
11

我有以下腳本:

#!/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,但找不到答案。

回答

25

Truth and Falsehood in perlsyn說明了什麼值被認爲在布爾上下文假:

數字0,字符串'0''', 空列表(),並undef是 都在布爾上下文假的。其他所有值都是正確的。

undef是從未初始化(或已使用undef function重置的變量)的值。如果表達式的值不是undef,則defined function返回true。

if $count是假,如果$count是數字0,字符串'0',空字符串,undef,或已被overloaded一個目的是在一個布爾上下文中使用時,返回的那些事情之一。否則,這是真的。 (空列表不能存儲在標量變量中。)

if defined $count僅在$countundef時爲false。

-1

我讀它的方式。

if $count只有在$count計算結果爲!= 0時才爲真,因此第三個數組中沒有0

if defined $count檢查$count作爲標量是否已創建,因爲您有$count標量,它與第一個標量相同。

+3

應該是:「當$ count評估!= 0」 – 2010-10-11 04:30:48

+0

@nathan。乾杯 – 2010-10-11 08:17:01

+0

實際上,他們都以相同的方式工作。這是他們測試的價值不同。第一個測試$ count的值,第二個是定義的$ count的值。如果()不關心你如何獲得價值。 – 2010-10-11 17:32:30

2

defined謂詞測試以查看變量(本例中爲$count)是否完全定義。在你編寫的代碼中,它總是在循環內部定義的,因爲它總是有一些價值。

如果您要添加:

undef $count; 
push (@first , 'undef'); 
push (@second , 'undef') if defined $count; 
push (@third , 'undef') if $count; 

在循環後,你會看到其中的差別。 (請注意,我改變了代碼中添加的,而不是$count字面'undef'因爲你會從增加實際undef價值得到誤導作用。

+0

說明defined()返回true或false並且if()檢查該值可能更正確一些。 defined()在有或沒有條件的情況下執行相同的事情。 – 2010-10-11 20:04:32

5

,如果你看到的的perldoc defined的文件,那麼你會發現,

  • 返回一個布爾值,告訴 EXPR是否具有比不確定undef值以外的值 。如果EXPR不存在,$ _是 檢查。

  • 一個簡單的布爾測試不會 區分undef,零, 空字符串和「0」,這些都是 同樣虛假

這意味着,

push (@second , 'undef') if defined $count; 

$count = 0,那麼它被定義的,因爲0undef定義返回true不同,但在這種情況下push (@third , 'undef') if $count;if condition失敗,這就是爲什麼它是不將0推入數組中。

3

if決定通過查看錶達式的值來運行其塊(或單語句),你給它:

if(EXPR) { ... } 

如果表達式爲true,它運行的塊。如果這個表達式是錯誤的,它不會。

該表達式可以是任何事情。 Perl會對錶達式進行評估,將其減少爲真或假的值。然後if()查看該值。

因此,刪除你的問題的一部分,你留下了「有什麼區別defined $count$count」。那麼,其中一個是defined的返回值,另一個是存儲在$count中的任何值。

如果您想弄清楚某個特定位代碼正在做什麼,請在一次一個步驟的同一邏輯進程中將其減少。看看每一步都做了什麼,你經常能夠回答你自己的問題。 :)

你說你搜索的文件,但我不知道你在哪裏看。如果你想查找一個內置的功能,你可以使用的perldoc的-f開關:

$ perldoc -f defined 

如果你想了解Perl的語法的東西,如if,這是在perlsyn

我有一個在Perl documentation documentation Perl文檔的初學者指南。

0

由於它們本質上不是布爾值,因此任何常見的「數字0,字符串'0'和'',空列表()和undef」都不應該等同於假。在技​​術上正確的情況下編寫依賴於這種變態的代碼會產生誤導,應該極力勸阻。應該是野草和娘娘腔。

相關問題