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.