Como verificar que o Perl de uma variável contém undef

Tarefa. O código na linguagem de programação Perl é variável. Você precisa verificar se o valor desta variável undef ou não.

Solução

A variável contém undef quando a função defined para esta variável retorna false. Aqui está o código que gera o o texto se em uma variável contém undef:

▶ Run
#!/usr/bin/perl

my $foo;

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

Decisões erradas

Para verificar se undef em uma variável precisa usar defined. Mas muitas vezes acontece que, para a verificação de undef usam outros, erros de maneiras.

Eis o primeiro exemplo de como não fazer:

▶ Run
#!/usr/bin/perl

my $foo;

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

Este exemplo realmente exibirá a linha foo is undef se a variável de $foo contém o valor undef, mas o código irá imprimir essa linha e, em outros casos. Por exemplo, se $foo mostra o número de 0 ou uma string vazia ''. Este código não é a verificação de que os $foo contém undef, e a verificação de que os $foo contém o valor de uma mentira, e isso não é o mesmo que undef.

Aqui está outro exemplo de confusão de verificação de undef:

▶ Run
#!/usr/bin/perl

my $foo;

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

Aqui em frente, todos completamente errado. Se a variável de $foo contém o valor undef, então este código exibe linha foo is undef, mas o código irá imprimir essa linha e, em outros casos. Por exemplo, se a variável $foocontém linha 'Hello'.

O operador == é projetado para comparar números. Antes de fazer a comparação, esta instrução converte seu argumento em um número. A variável $foo em que está undef torna-se o número de 0. E undef à direita do operador, também, torna-se o número de 0. Zero é igual a zero, a condição é acionado. Mas tornam-se zero, e algumas das linhas, por exemplo 'Hello'.

Se você adicionar esse código use strict; e use warnings;, o Perl exibirá a linha foo is undef, mas assim mesmo lhe informará o que acontece algo estranho:

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

Em geral, é sempre uma boa prática usar sempre use strict; e use warnings;.

Temas relacionados

Outros artigos