autovivification (オートヴィビフィケーション)

配列やハッシュの未定義の値の自動生成

autovivification (オートヴィビフィケーション) とは、配列やハッシュから存在しない要素にアクセスした際に、 自動的にその要素が生成される仕組みのことを指します。 autovivification の挙動は言葉では分かりにくいので、サンプルコードを見てみましょう。

次の例では空の配列が定義されていますが、未定義の要素に文字列を追加しようとしてます。 しかし、その存在しなかった要素が自動生成され、あたかもその要素には空文字列がセットされていたかのように振る舞います。

my @ary = ();
$ary[2] .= 'Hello';
print $ary[2], "\n";    # Hello

同様のことはハッシュでも行われます。 次の例は空のハッシュに、存在しないはずの要素に対してインクリメントしています。 しかし、autovivification によって、該当の要素に 0 がセットされていたかのように振る舞います。

my %hash = ();
$hash{taro}++;
print $hash{taro}, "\n";    # 1

autovivification は配列やハッシュのリファレンスでも有効です。

my $hash = {};
$hash->{taro}++;
print $hash->{taro}, "\n";    # 1

さらに深い階層の値も直接生成されます。

my $hash = {};
$hash->{taro}->{age}++;
print $hash->{taro}->{age}, "\n";    # 1

驚くことに、ハッシュリファレンスとして初期化すらしていない undef の変数ですら、 ハッシュリファレンスとして自動的に扱ってくれます。

my $hash;
$hash->{taro}->{age}++;
print $hash->{taro}->{age}, "\n";    # 1

この便利そうな autovivification ですが、他のプログラミング言語と比べて緩すぎると感じる人もいることでしょう。 場合によっては意図しない結果を招く恐れもあります。 autovivification に頼り過ぎないよう注意が必要です。