第一折:
my @arr;
$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;
是無義。 {}
是散列鍵,所以你指的是%arr
而不是@arr
。 use 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;
這將採取@arr
與grep
過濾它(返回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;
會告訴你這個)。
並且如果您使用'$ arr [1] = 1;'。等等? *總是*'嚴格使用;使用警告;'! – Biffen
關於嚴格和警告的好處。我仍然想堅持這個問題,當我用'{}'而不是'[]'聲明時,如何得到一個計數結果? –
啓用嚴格和警告會告訴你什麼?可能是關於缺少'%arr'的東西? '$ arr {1}'修改'%arr',而不是'@ arr'。你將不得不堅持Perl的語法。 – Biffen