Jak sprawdzić czy w Perlu zmiennej zawiera undef

Zadanie. W kodzie w języku programowania Perl jest zmienna. Trzeba sprawdzić czy wartość tej zmiennej undef lub nie.

Rozwiązanie

W zmiennej zawiera undef tylko, jeżeli funkcja defined dla tej zmiennej zwraca fałsz. Oto kod który wyświetla tekst jeśli w zmiennej zawiera undef:

▶ Run
#!/usr/bin/perl

my $foo;

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

Złe decyzje

Aby sprawdzić czy undef w zmiennej należy użyć defined. Ale często bywa co do sprawdzania na undef wykorzystują inne, błędne sposoby.

Oto pierwszy przykład jak nie należy robić:

▶ Run
#!/usr/bin/perl

my $foo;

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

Ten przykład jest naprawdę wyprowadzi wiersz foo is undef jeśli w zmiennej $foo zawiera wartość undef, ale kod wyświetli tę linijkę i w innych przypadkach. Na przykład, jeśli w $foo zawiera liczbę 0 lub pusty ciąg znaków ''. Ten kod to nie jest test na to, że w $foo zawiera undef, a sprawdzanie na to, że w $foo zawiera wartość false, a to zupełnie nie to samo, co undef.

Oto jeszcze jeden przykład błędnej weryfikacji na undef:

▶ Run
#!/usr/bin/perl

my $foo;

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

Tu już wszystko jest całkowicie błędne. Jeśli w zmiennej $foo zawiera wartość undef, to ten kod wyświetli miejsce foo is undef, ale kod wyświetli tę linijkę i w innych przypadkach. Na przykład jeśli w zmiennej $foozawiera wiersz 'Hello'.

Operator == jest przeznaczony dla porównania liczb. Przed tym jak wykonać porównanie operator ten przekształca swoje argumenty w liczby. Zmienna $foo , w której znajduje się undef staje się liczbą 0. I undef po prawej stronie operatora też staje się liczbą 0. Zero równa się zero, warunek jest wyzwalany. Ale stają się zerem i niektóre wiersze, na przykład 'Hello'.

Jeśli dodać do tego kodu use strict; i use warnings;, to Perl wyświetli ciąg foo is undef, ale tak samo powie o tym co się dzieje coś dziwnego:

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

A w ogóle to zawsze bardzo dobra praktyka zawsze używać use strict; i use warnings;.

Tematy pokrewne

Inne artykuły