2016-01-12 94 views
1

我試圖打印出我的數組大小。我已經在堆棧中跟隨了其他一些問題,但是我從來沒有得到我想要的結果。計數perl數組大小

我希望在這個例子中的值是3打印,因爲我有3個索引。我得到的,無論從打印方式爲0

my @arr; 

$arr{1} = 1; 
$arr{2} = 2; 
$arr{3} = 3; 

my $size = @arr; 

print $size; # prints 0 

print scalar @arr; # prints 0 

我在做什麼錯了,我如何得到一個數組的總大小時宣佈&填充這種方式?

+4

並且如果您使用'$ arr [1] = 1;'。等等? *總是*'嚴格使用;使用警告;'! – Biffen

+0

關於嚴格和警告的好處。我仍然想堅持這個問題,當我用'{}'而不是'[]'聲明時,如何得到一個計數結果? –

+9

啓用嚴格和警告會告訴你什麼?可能是關於缺少'%arr'的東西? '$ arr {1}'修改'%arr',而不是'@ arr'。你將不得不堅持Perl的語法。 – Biffen

回答

15

第一折:

my @arr; 

$arr{1} = 1; 
$arr{2} = 2; 
$arr{3} = 3; 

是無義。 {}是散列鍵,所以你指的是%arr而不是@arruse strict;use warnings;會告訴你這一點,而這只是他們被認爲是強制性的一小部分。

要計算數組中的元素,只需在標量上下文中對其進行訪問。

print scalar @arr; 

if ($num_elements < @arr) { do_something(); } 

但是,你需要改變你的東西

my @arr; 

$arr[1] = 1; 
$arr[2] = 2; 
$arr[3] = 3; 

,並注意 - 你的陣列$arr[0]的第一個元素是不確定的。

$VAR1 = [ 
      undef, 
      1, 
      2, 
      3 
     ]; 

結果,你會得到的4結果爲了讓你將需要過濾的未定義項目所需的「要素計數」,用類似grep

print scalar grep {defined} @arr; 

這將採取@arrgrep過濾它(返回3個元素),然後取標量值 - 元素的數量,在這種情況下爲3.

但通常情況下 - 您不會這樣做。這只是必要的,因爲你試圖將值插入到數組中的特定'插槽'中。

,你會怎麼做,更常見的是使用一個直接分配:

my @arr = (1, 2, 3); 

或者:

push (@arr, 1); 
push (@arr, 2); 
push (@arr, 3); 

這在數組的末尾插入值。你會 - 如果明確地迭代 - 從0..$#arr去,但你很少需要這樣做的時候,你可以這樣做:

foreach my $element (@arr) { 
    print $element,"\n"; 
} 

或者你也可以用哈希做到這一點:

my %arr; 

$arr{1} = 1; 
$arr{2} = 2; 
$arr{3} = 3; 

這就使你的數組一組(無序)鍵值對,您可以用keys %arr訪問和做的完全一樣:

print scalar keys %arr; 
if ($elements < keys %arr) { do_something(); } 

在後一種情況下,你的哈希值將是:

$VAR1 = { 
      '1' => 1, 
      '3' => 3, 
      '2' => 2 
     }; 

我會建議這是不好的做法 - 如果您已經排序了值,則作業的工具是數組。如果你有'關鍵'值,散列可能是工作的工具 - 例如'請求ID'或類似的。您通常可以通過查看數據訪問方式以及是否存在任何差距(包括從零開始)來區分差異。

因此,要回答你的問題問爲:

my $size = @arr; 
print $size; # prints 0 
print scalar @arr; # prints 0 

這些不工作,因爲你永遠不插入任何值到@arr。但是你確實有一個名爲%arr的散列,它是你隱式創建的。 (再次 - use strict;use warnings;會告訴你這個)。

+1

而不是向他們展示如何''grep'出未定義的元素,我認爲只是向他們展示如何填充以索引0開始的數組更有意義。每次他們創建一個新數組時,我都可以使用'grep'來描繪它們,因爲Perl有這個「奇怪的錯誤」,總是在數組的開頭放入一個未定義的元素。 – ThisSuitIsBlackNot

+0

好點,我會擴展它。 – Sobrique

2

您正在初始化散列,而不是數組。

要獲得散列的「大小」,您可以編寫。

my $size = keys %arr; 
0

我只是覺得應該有你的代碼USUW運行的示意圖(使用嚴格的/使用警告),並把它添加到故障排除過程是什麼:

use strict; 
use warnings; 

my @arr; 
... 

當你運行它:

Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 9. 
Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 10. 
Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 11. 
Execution of - aborted due to compilation errors. 

所以USUW。

0

你可能會認爲你是實例,當你在下面的代碼輸入一個@arr的元素:

$arr{1} = 1; 

但是,您實例化一個哈希這樣做。這告訴我你沒有使用嚴格的或者你會有錯誤。改爲括號,如下所示:

$arr[1] = 1;