In alcuni linguaggi c'è un modo specifico per dire "questo campo non ha un valore". In SQL, PHP e Java questo valore è NULL. In Python è None. In Ruby si chiama Nil.

In Perl questo valore è undef.

Vediamo alcuni dettagli.

Da dove viene undef?

Quando dichiari una variabile scalare senza assegnarvi un valore, il suo contenuto sarà il valore ben definito undef.

my $x;

Alcune funzioni restituiscono undef per indicare fallimento. Altre possono ritornare undef se non hanno nulla di sensato da restituire.

my $x = do_something();

Si può usare la funzione undef() per resettare il valore di una variabile ad undef:

# some code
undef $x;

Si può anche utilizzare il valore di ritorno della funzione undef() per settare una variabile ad undef:

$x = undef;

Le parentesi dopo il nome della funzione sono opzionali e le ho tralasciate nell'esempio.

Come si può vedere, ci sono diversi modi per far valere undef una variabile scalare. La domanda successiva è: cosa succede se usi una variabile del genere?

Prima di pensarci, vediamo qualcos'altro:

Come verificare se il valore di una variabile è undef?

La funzione defined() restituisce vero se il valore passato non è undef. Restituirà invece falso se il valore passato è undef.

Può essere usata in questo modo:

use strict;
use warnings;
use 5.010;

my $x;

# some code here that might set $x

if (defined $x) {
    say '$x is defined';
} else {
    say '$x is undef';
}

Qual è il vero valore di undef?

Anche se undef indica l'assenza di valore, non è utilizzabile come valore di per sé. Perl fornisce due default utilizzabili invece di undef.

Se si usa una variabile che è undef in un'operazione numerica, viene considerata 0.

Se la si usa in un'operazione tra stringhe, viene considerata come la stringa vuota.

Si veda il seguente esempio:

use strict;
use warnings;
use 5.010;

my $x;
say $x + 4, ;  # 4
say 'Foo' . $x . 'Bar' ;  # FooBar

$x++;
say $x; # 1

Nell'esempio sopra, la variabile $x - che è undef per default - si comporta come uno zero nella somma (+), come la stringa vuota nella concatenazione (.) e di nuovo come 0 nell'operazione di autoincremento (++).

Comunque, non filerà tutto liscio. Se si sono richiesti i warnings, attraverso il pragma use warnings (cosa sempre raccomandata), si otterranno due warning di tipo use of unitialized value per le prime due operazioni, ma non per l'autoincremento:

Use of uninitialized value $x in addition (+) at ... line 6.
Use of uninitialized value $x in concatenation (.) or string at ... line 7.

Penso che non ci sia un warning per l'autoincremento perché perl perdona. Nel seguito vedremo che questo è comodo nelle situazioni in cui si voglia contare qualcosa.

Ovviamente, si possono evitare i warning inizializzando la variabile al valore corretto (0 o la stringa vuota, a seconda della necessità), o disabilitando selettivamente i warning. Vedremo quest'opzione in un articolo diverso.