In the Perl programming language, autovivification is the automatic creation of new arrays and hashes as required every time an undefined value is dereferenced. Perl autovivification allows a programmer to refer to a structured variable, and arbitrary sub-elements of that structured variable, without expressly declaring the existence of the variable and its complete structure beforehand.
In contrast, other programming languages either:
Perl autovivification can be contrasted against languages such as Python, PHP, Ruby, and many of the C style languages, where dereferencing null or undefined values is not generally permitted. It can be compared to the HTML standard's "named access on the window object" which results in corresponding globally scoped variables being automatically accessible to browser-based JavaScript.
It is important to remember that autovivification happens when an undefined value is dereferenced. An assignment is not necessary. The debugger session below illustrates autovivification of a hash just from examining it:
The debugger session below illustrates autovivification of a hash from assigning to an inner hash:
Hashes several layers deep were created automatically without any declarations. Autovivification can prevent excessive typing. If Perl did not support autovivification, the structure above would have to be created as follows:
Perl 5.6.1 and newer support autovivification of file and directory handles. Calling <code>open()</code> on an undefined variable will set it to a filehandle. According to perl561delta, "[t]his largely eliminates the need for typeglobs when opening filehandles that must be passed around, as in the following example:
The C++ Standard Library's associative containers (<code>std::unordered_map</code> and <code>std::map</code>) use <code>operator[]</code> to get the value associated to a key. If there is nothing associated to this key, it will construct it and value initialize
the value. For simple types like int or float, the value initialization will be zero initialization.
Another example of counting occurrences of strings:
A similar trick can be achieved with the <code>insert()</code> method, which returns an iterator to the element associated to the key, even if it already exists.
Python's built-in <code>dict</code> class can be subclassed to implement autovivificious dictionaries simply by overriding the <code>__missing__()</code> method that was added to the class in Python v2.5. There are other ways of implementing the behavior, but the following is one of the simplest and instances of the class print just like normal Python dictionary objects.
Ruby hashes can take a block specifying an object to be returned for non-existing indexes. These can be used to implement autovivificious maps.
Java Map has a method <code>computeIfAbsent</code> that can be used to emulate autovivificous maps.
PHP arrays are natively autovivificious.
However, this only applies to assignment, and not array access.
ES6 introduces a new class that can be used to implement autovivification. With other features of JavaScript, this can be reduced to a single line of code:
C#, using indexers and C# 4.0 dynamics,
can be used for implementing different syntaxes also,