讓我從一個簡單的最小示例開始:
use strict;
use warnings;
use Data::Dumper;
my %hash;
$hash{count} = 4;
$hash{elems}[$_] = {} for (1..$hash{count});
print Dumper \%hash;
這是結果(重新格式化):
$VAR1 = {
'count' => 4,
'elems' => [undef, {}, {}, {}, {}]
};
我不明白,為什么第一個元素$hash{elems}變成了一個undef?
我知道可能有更簡單的方法來做我正在做的事情,但我正在創建這些空散列,以便我以后可以做my $e = $hash{elems}[$i]并繼續使用$e與元素互動,例如繼續使用$e->{subelems}[0] = 100.
uj5u.com熱心網友回復:
陣列索引從0Perl 開始(以及在大多數編程語言中)。
在 , 的第一次迭代中,$hash{elems}[$_] = {} for (1..$hash{count});是$_,1因此你{}把.1$hash{elems}
由于您沒有在索引0處放置任何內容$hash{elems},因此它包含undef.
為了解決這個問題,您可以使用push而不是分配給特定索引:
push @{$hash{elems}}, {} for 1 .. $hash{count};
push在其第一個引數的末尾添加專案。最初,$hash{elems}是空的,所以結尾是第一個索引 ( 0)。
一些技巧:
for (1..$hash{count})在:中不需要括號,for 1 .. $hash{count}效果也一樣,看起來更輕一些。您可以在宣告散列時對其進行初始化:
my %hash = ( count => 4, elems => [ map { {} } 1 .. 4 ] );elems由于 autovivification ,使用 hashrefs 的 arrayref 進行初始化通常是無用的。簡單地做$hash{elems}[0]{some_key} = 42將創建一個 arrayref in$hash{elems},一個 hashref0在這個陣列的索引處,包含some_key帶有 value的鍵42。
但在某些情況下,您的初始化可能是有意義的。例如,如果你想傳遞$hash{elems}(但不是$hash)給一個函式(如果你想傳遞$hash{elems}[..]給一個函式而不傳遞$hash{elems})。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453016.html
