2013-10-31 52 views
1

我有以下函數返回的數組:爲什麼打印一個perl數組給計數?

sub getUsers() { 
    @users[0] = 'test'; 
    @users[1] = 'test2'; 
    return @users; 
} 

@temp = getUsers(); 
$i = @temp; 

print "There are $i users"; 

但是,當我將其打印出來,它顯示爲數量2(陣列的計數)。發生了什麼?

+0

您的標量值分配給數組,因而它的計算結果,其中在Perl意味着給我陣列的長度標量上下文。 – squiguy

+2

@squiguy讓你感覺倒退了。 :)這是分配一個數組到一個標量值。 – friedo

+0

@friedo Doh!誦讀困難再次襲擊...... – squiguy

回答

11

$i =是一個標量賦值,給出了賦值標量上下文的右側;當你在標量上下文中提到一個數組時,它會返回它的長度。

0

當您在標量上下文中使用數組時,數組將返回數組中的項目數。

從上的Perldoc在標量上下文Perldata

列表賦值返回通過對分配的右側的表達式生產要素的數量...

當你說:

$i = @temp; 

您正在列表並嘗試將其分配給標量變量。您在標量上下文中使用該數組。因此,你得到數組的大小。 (不是最大的指數這就是$#temp將讓你

可以使用scalar函數強制在標量上下文沉數組它可能不是否則: ` 打印「有」標@foo。 「在陣列項目\ n」;

print函數可以接受的時間列表,而不是隻是一個單一的字符串,然後它使用可變$,的值加入數組

如果你想。項目清單,使用join加入列表合併成一個字符串:

print "There are " . scalar @foo . " items in the array\n"; 
print "They are " . join (", " $foo) . ".\n"; 
+0

'$ i = @temp;'是* void *上下文中的*標量*賦值。你引用的段落是不相關的。 – ikegami

+0

「你正在做一個列表並嘗試將它分配給一個標量變量。」不正確。 '$ i = @temp;'中沒有任何列表。根據你的邏輯,'$ i =(5,6,7);'應該在實際分配'7'時分配'3'。 – ikegami

+0

閱讀[this](http://www.perlmonks.org/?node_id=790129)可能對您有用。 – ikegami

相關問題