Hvordan ind i Perl en variabel indeholder undef

Opgave. Koden i programmeringssproget Perl er variabel. Du er nødt til at kontrollere, om værdien af denne variabel undef eller ej.

Afgørelsen

En variabel indeholder undef kun, hvis funktionen defined for den variabel, returneres false. Her er den kode, der viser tekst, om en variabel indeholder undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !defined($foo) ) {
    print "foo is undef";
}

Den forkerte beslutning

For at kontrollere, om undef i en variabel, du nødt til at bruge defined. Men det sker ofte, hvad med at tjekke for undef brug af andre, forkerte måder.

Her er det første eksempel på hvordan man ikke skal gøre det:

▶ Run
#!/usr/bin/perl

my $foo;

if ( !$foo ) { # error!
    print "foo is undef";
}

Dette eksempel er virkelig bare string foo is undef , hvis den variable $foo indeholder den værdi, undef, men koden udskriver denne linje i andre tilfælde. For eksempel, hvis $foo indeholder antallet 0 eller den tomme streng ''. Denne kode er ikke for at kontrollere, at $foo indeholder undef, og kontrollere, at $foo indeholder værdien falsk, og det er absolut ikke det samme som undef.

Her er et andet eksempel på ukorrekt validering undef:

▶ Run
#!/usr/bin/perl

my $foo;

if ( $foo == undef ) { # error!
    print "foo is undef";
}

Der er bare alt helt forkert. Hvis variablen $foo indeholder en værdi undef, denne kode udskriver sted foo is undef, men koden udskriver denne linje i andre tilfælde. For eksempel, hvis du er i en variabel $fooindeholder string 'Hello'.

Operatøren == er beregnet for sammenligning af tallene. Før du foretager en sammenligning af denne operatør konverterer argumenterne til et tal. Variabel $foo , som er undef bliver antallet 0. Og undef operatørens ret bliver også antallet 0. Nul er nul, betingelsen er udløst. Men nul og nogle linjer, for eksempel 'Hello'.

Hvis du føjer du denne kode use strict; og use warnings;, så Perl, vil output foo is undef, men bare lade dig vide, hvad der foregår noget mærkeligt:

Use of uninitialized value in numeric eq (==) at script.pl line 8.
Use of uninitialized value $foo in numeric eq (==) at script.pl line 8.
foo is undef

Generelt, det er altid en meget god idé altid at bruge use strict; og use warnings;.

Relaterede emner

Andre artikler