Se undef essere la chiave hash in Perl?

La risposta è no.

undef non può essere la chiave hash in Perl. Ma sono finezze che potrebbe avere l'impressione che può. I dettagli di seguito.

Che cosa è l'hash

Una delle strutture di dati, che esiste nel linguaggio di programmazione Perl è un hash. Hash è un insieme non ordinato di coppie di valori. Ecco un esempio di hash:

my %h = (
    aa => 1,
    bb => 2,
);

In questo хеше mantenuto due coppie di valori. In chiave con il nome 'aa' valore memorizzato 1, e in chiave con il nome 'bb' valore memorizzato 2. Per ottenere questi valori, utilizzano la sintassi $h{aa} e $h{bb}.

Che cosa è undef

undef è un valore speciale in Perl, che significa mancanza di valori. Se si crea una variabile, ma non assegnare alcun valore, il suo valore sarà come una volta undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Il programma visualizzerà il testo $VAR1 = undef;.

undef è ancora possibile ottenere se rivolgersi a un elemento di un array o a inesistente chiave in хеше. È possibile specificare esplicitamente undef variabile: $var = undef;.

L'erronea uso 1

Ecco un esempio di programma di cui sembra che undef può essere la chiave hash:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

Il programma visualizza un testo asdf. Cioè come se abbiamo creato a хеше chiave undef, e poi ha ottenuto il valore di questa chiave. Ma non è così. In questo esempio, il valore viene memorizzato in chiave 'undef', cioè una stringa di 'undef', e non è vero undef.

Così accade a causa di due caratteristiche.

Quando si crea un hash abbiamo creato in lui una coppia chiave-valore utilizzando il codice undef => 'asdf',. In questo codice viene utilizzato l'operatore =>. La particolarità di questo l'operatore che in alcune situazioni si può percepire ciò che è a sinistra come una stringa. E ' come se fosse conclude quello che si trova a sinistra del => tra virgolette. undef => 'asdf', è in realtà 'undef' => 'asdf',.

La seconda caratteristica è come si estrae il valore di hash di una chiave. Usiamo la sintassi $h{undef}. E qui Perl ritiene che quello che si trova tra parentesi graffe è una stringa. Quello che abbiamo scritto qui è lo stesso che e $h{'undef'}.

Per assicurarsi che questo è vero se si esegue lo script, collegando un modulo speciale che invece di eseguire il codice che mostra come Perl capisce questo codice. perl -MO=Deparse script.pl. Ecco la conclusione:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

L'erronea l'uso di 2

Ecco un altro esempio di codice da cui erroneamente sembra che undef può essere la chiave di hash. Qui qualcosa usiamo un vero undef, e non posto 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

Il programma visualizza un testo asdf. Cioè, sembra davvero che noi abbiamo creato il valore in хеше chiave undef.

Ma in realtà, abbiamo messo il valore nella chiave '' (stringa vuota). Se scrivere alla fine di questo programma di comando use Data::Dumper e warn Dumper \%h;, dopo l'avvio sullo schermo sarà visto come in realtà sembra hash:

$VAR1 = {
          '' => 'asdf'
        };

Variabile $var contiene in sé il valore undef, ma se usato in $var => 'asdf', e $h{$var} undef è sostituito da una riga vuota ''.

Se si desidera aggiungere al codice use strict; e use warnings; (che è quasi sempre la pena di fare), allora nell'output del programma sarà visto Perl avverte di usare questo:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

Curriculum

undef non può essere il valore di una chiave in Perl хеше. Chiavi in Perl хеше è sempre comando. (Precisiamo solo che una stringa vuota '' può anche essere la chiave). E valori in хеше possono essere completamente arbitraria e c'senza problemi può essere undef.

Altri articoli