undef i Perl

undef i programmeringssproget Perl er en af de værdier, som kan være indeholdt i en variabel. Hvis du ikke tildele en værdi til en variabel, variabel vil være undef.

Her er et eksempel Perl program:

▶ 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;

Dette program vil vise:

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

Vi først erklæres en variabel, men har ikke tildelt det nogen værdi: my $var;. Så med hjælp print Dumper $var; bragte oplysninger om værdien af denne variabel til skærmen (du kan se, at variablen indeholder undef). Efter at vi har tildelt en variabel antal 123og viste det på skærmen. Og så ved hjælp af den kode, $var = undef; vi er tildelt variablen undef og igen bragt oplysninger om det.

undef kan være et element i array eller værdi i hash:

▶ 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;

Ofte undef anvendes som et særligt flag. For eksempel, kan være en funktion, som returnerer altid et nummer, men i tilfælde af fejl returnerer undef.

Navn undef kommer fra det engelske ord undefined("undefined").

End undef er ikke

undef er en enkelt værdi. Dette er ikke en streng 'undef', det er ikke en tom streng '' , og det er ikke antallet 0. Alle forskellige værdier.

▶ Run
#!/usr/bin/perl

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

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

I tilfælde af hash, hvis centrale værdi undef er ikke det samme som, at hash ikke er en sådan nøgle.

Hvordan at kontrollere, om undef

For at kontrollere, om værdien undef funktion bruges defined. Værdien er undef hvis funktionen defined returnerer false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

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

Det er meget nemt at skrive en Saba is_undef, som vil returnere true, hvis det gik 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';
}

Men de fleste gør ikke, og skal du bruge funktionen defined uden nogen bånd.

Der er en anden måde, hvordan at kontrollere, at en variabel indeholder, er overholdt for at anvende operatør ~~ (denne operator kaldes smartmatch). Denne erklæring viste sig i Perl 5.10, men fra Perl 5.18 brug af denne operatør giver en advarsel Smartmatch is experimental at script.pl line 8.. Her er et eksempel kode med denne udtalelse:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

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

Ofte er den bedste måde at kontrollere for undef er en funktion defined.

Perl undef og konvertering til JSON

Bibliotek for at arbejde med JSON i Perl konverterer Perl værdi undef i null i JSON:

▶ Run
#!/usr/bin/perl

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

print encode_json {
    a => undef,
};

Denne kode vil vise {"a":null}.

Omvendt, når konvertering fra JSON null bliver undef:

▶ Run
#!/usr/bin/perl

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

print Dumper decode_json '[null]';

Denne kode vil vise:

$VAR1 = [
          undef
        ];

Funktion ref

Resultatet af funktionen ref med hensyn til undef er en tom streng, ''. I denne forbindelse undef , er ikke forskellig fra strenge og tal. For undef, strenge og tal-funktionen ref returnerer en tom streng:

▶ Run
#!/usr/bin/perl

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

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

En Boolesk værdi

Når du bruger undef i logiske operationer undef er en løgn. Denne kode vil skærmen tekst false:

▶ Run
#!/usr/bin/perl

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

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

Brug med strygere

I tilfældet, hvis du bruger undef operationer med strygere, i stedet undefvil være brug en tom streng '', men også viser en advarsel.

▶ 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';
}

I det første tilfælde, vil en advarsel blive vist Use of uninitialized value in concatenation (.) or string at script.pl line 10., i det andet tilfælde Use of uninitialized value in string eq at script.pl line 8..

Brug med tal

I tilfældet, hvis du bruger undef operationer med tallene, i stedet undefvil blive antallet 0. men den samme advarsel vises.

▶ 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';
}

I det første tilfælde, vil en advarsel blive vist Use of uninitialized value $var in addition (+) at script.pl line 8., i det andet tilfælde Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Det er interessant, at når du bruger den increment operator ++ meddelelse nr.:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Relaterede emner

Andre artikler