Kan undef til at være en hash-nøgle i Perl?

Svaret er nej.

undef ikke kan være et hash-nøgle i Perl. Men der er finesser, der du tror måske, at det kan. Detaljer nedenfor.

Hvad er en hash

En af de data strukturer der findes i programmeringssproget Perl er hash. Et hash er en uordnet sæt af værdier. Her er et eksempel hash:

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

Denne hash er lagret to par af værdier. Nøgle med navnet 'aa' lagrede værdi 1, og i nøgle med navnet 'bb' gemmer værdien 2. For at opnå disse værdier, skal du bruge syntaks $h{aa} og $h{bb}.

Hvad er undef

undef er en særlig værdi i Perl, hvilket betyder, at der ingen værdi. Hvis du oprette variablen, men ikke tildele det nogen værdi, og dens værdi vil være lige undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Programmet vil vise teksten $VAR1 = undef;.

undef er stadig tilgængelig, hvis du har adgang til et ikke-eksisterende array-element, eller en ikke-eksisterende nøgle i et hash. Du kan eksplicit tildele undef variable: $var = undef;.

Forkert brug 1

Her er en prøve på programmet, som synes undef kan være nøglen hash:

▶ Run
#!/usr/bin/perl

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

print $h{undef};

Programmet viser den tekst, asdf. Ie som vi har skabt i hash-nøgle undef, og så fik jeg den værdi for denne nøgle. Men det er det ikke. I dette eksempel er værdien gemt nøglen 'undef', dvs række 'undef', ikke er en reel undef.

Dette sker på grund af to funktioner.

Når du opretter hash skabte vi det i et par nøgle-værdi ved hjælp af kode undef => 'asdf',. Denne kode bruger operatøren =>. Det er kendetegnende for denne den sætning er, at det i nogle situationer kan han tage, hvad der er tilbage som en streng. Han konkluderer, ligesom hvad der er tilbage af den => , i citationstegn. undef => 'asdf', er faktisk 'undef' => 'asdf',.

Den anden funktion er, hvordan vi får værdi fra hash ved nøgle. Vi bruger den syntaks $h{undef}. Og så Perl mener, at det er i de krøllede parenteser er en streng. Hvad vi har skrevet her, er den samme som $h{'undef'}.

Kan være sikker på, at det virkelig er, som om du kører scriptet ved at tilslutte et særligt modul, der i stedet for at udføre kode viser, hvordan Perl forstår denne kode. perl -MO=Deparse script.pl. Her er resultatet:

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

Forkert brug af 2

Her er et andet eksempel på kode, som fejlagtigt tror, at undef kan være nøglen hash. Åh, der er det vi bruger rigtig undef, ikke linje 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

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

print $h{$var};

Programmet viser den tekst, asdf. Ie, mener vi, at vi har skabt værdien i den hash, de vigtigste undef.

Men virkelig, vi har placeret en værdi i det centrale '' (en tom streng). Hvis der føjes til slutningen af dette program linje use Data::Dumper og warn Dumper \%h;, efter start på skærmen, der ligner faktisk en hash:

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

Variabel $var indeholder en værdi undef, men når det bruges i $var => 'asdf', og $h{$var} undef erstattes af en tom streng ''.

Hvis du tilføjer koden use strict; og use warnings; (som er næsten altid værd at gøre), så i output, vil det ses, at Perl advarer om denne brug:

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.

Oversigt

undef ikke kan være en værdi af en nøgle i Perl hash. Nøgler i en Perl hash er altid en linje. (Angiv kun som en tom streng '' kan også være nøglen). Og de værdier, der er i hash kan være helt og enhver der er ikke noget problem at være undef.

Andre artikler