undef in Perl

undef nel linguaggio di programmazione Perl è uno dei valori che può essere contenuta in una variabile. Se non assegnare ad una variabile un valore in una variabile è undef.

Ecco un esempio di un programma Perl:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $var;
print Dumper $var;

$var = 123;
print Dumper $var;

$var = undef;
print Dumper $var;

Questo programma visualizza:

$VAR1 = undef;
$VAR1 = 123;
$VAR1 = undef;

In primo luogo abbiamo dichiarato una variabile, ma non è assegnato alcun valore: my $var;. Poi con l'aiuto di print Dumper $var; hanno informazioni circa il valore di questa variabile sulla schermata (visto che la variabile contiene undef). Dopo di che, abbiamo dato variabile numero 123e hanno mostrato sullo schermo. E poi con il codice $var = undef; è assegnato alla variabile undef e di nuovo hanno informazioni su di esso.

undef può essere un elemento in un array o un valore in хеше:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @arr = (1, undef, 'three');
print Dumper \@arr;

my %h = (
    a => undef,
);
print Dumper \%h;

Spesso undef viene utilizzato come una bandiera speciale. Ad esempio, può essere una funzione che restituisce un numero, ma in caso di errore restituisce undef.

Il nome undef deriva dalla parola inglese undefined("undefined").

Di undef non è

undef è un singolo valore. Non è che non stringa 'undef', non è una stringa vuota '' e non il numero di 0. Tutto questo — valori diversi.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $var (undef, 'undef', '', 0) {
    print Dumper $var;
}

In caso di hash se il valore della chiave undef non è la stessa cosa che in хеше manca la chiave.

Come verificare la undef

Per verificare se un valore undef utilizza la funzione defined. Il valore è undef se la funzione defined restituisce false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if (!defined($var)) {
    print 'var is undef';
}

Molto facile scrivere sabu is_undef, che restituirà la verità se lei consegnato undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;

sub is_undef {
    my ($maybe_undef) = @_;
    return !defined($maybe_undef);
}

my @arr = (1, undef, 'three');

foreach my $el (@arr) {
    say is_undef($el) ? 'undef' : 'not undef';
}

Ma spesso non lo fanno, e utilizzano la funzione defined senza qualsiasi tipo di legatura.

C'è un altro modo di come è possibile verificare che la variabile contiene undef è utilizzare l'operatore ~~ (questo operatore è chiamato smartmatch). Questo operatore è apparso in Perl 5.10, ma a partire dalla versione di Perl 5.18 l'uso di questa istruzione genera un avviso Smartmatch is experimental at script.pl line 8.. Ecco un esempio di codice con questo operatore:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var ~~ undef) {
    print 'var is undef';
}

Spesso il modo migliore per verificare la undef è una funzione defined.

Perl undef e la conversione in JSON

Libreria per lavorare con JSON in Perl trasformano Perl valore undef in null in JSON:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;

print encode_json {
    a => undef,
};

Questo codice visualizza {"a":null}.

E viceversa, durante la conversione da JSON null diventa undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;
use Data::Dumper;

print Dumper decode_json '[null]';

Questo codice verrà visualizzato:

$VAR1 = [
          undef
        ];

Funzione ref

Il risultato del lavoro funzione ref in relazione alla undef è una stringa vuota ''. In questo senso undef non è diverso da stringhe e numeri. Per undef, stringhe e numeri funzione ref restituisce una stringa vuota:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $el ('asdf', undef, 100) {
    print Dumper ref($el);
}

Un valore booleano

Quando si utilizza undef a logiche operazioni undef — questa è una bugia. Questo codice verrà visualizzato la schermata di testo false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

if (undef) {
    print 'true';
} else {
    print 'false';
}

L'uso con le stringhe

Nel caso in cui utilizzare undef nelle operazioni con le stringhe, invece undefsarà essere una stringa vuota '', ma anche verrà mostrato un messaggio di avviso.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print 'AAA' . $var . 'BBB';
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var eq '') {
    print 'equal';
} else {
    print 'not equal';
}

Nel primo caso, viene visualizzato un avviso Use of uninitialized value in concatenation (.) or string at script.pl line 10., nel secondo caso Use of uninitialized value in string eq at script.pl line 8..

L'uso con i numeri

Nel caso in cui utilizzare undef nelle operazioni con i numeri, invece undefsarà usato numero di 0. ma sarà mostrato un messaggio di avviso.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var + 4;
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var == 0) {
    print 'equal';
} else {
    print 'not equal';
}

Nel primo caso, viene visualizzato un avviso Use of uninitialized value $var in addition (+) at script.pl line 8., nel secondo caso Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Interessante notare che quando si utilizza l'operatore di incremento ++ avviso no:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Temi correlati

Altri articoli