undef em Perl

undef , na linguagem de programação Perl — é um dos valores que pode estar contido em uma variável. Se você não atribuir o valor da variável, o variável será undef.

Aqui está um exemplo de programa Perl:

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

Este programa irá imprimir na tela:

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

Primeiro, nós anunciamos uma variável, mas não atribuiu a ela qualquer valor: my $var;. Mais com a ajuda de print Dumper $var; derivaram-se as informações sobre o valor desta variável para a tela (visto que uma variável contém undef). Depois que se apropriaram de um número variável de 123e é mostrado na tela. E então, com o código $var = undef; nós atribuiu a variável undef e, novamente, tiraram detalhes sobre o assunto.

undef pode ser um elemento na matriz, ou o valor em хеше:

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

Muitas vezes undef é utilizado como um sinalizador. Por exemplo, pode ser um recurso que sempre retorna o número, mas em caso de erro retorna undef.

Nome undef vem da palavra em inglês undefined("frase indefinida").

Que undef não é

undef é o valor individual. Não é nenhuma linha de 'undef', não é uma seqüência de caracteres vazia '' e não é o número de 0. Tudo isso são valores diferentes.

▶ Run
#!/usr/bin/perl

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

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

Em caso de hash se o valor da chave undef não é o mesmo que хеше falta a tal chave.

Como verificar o undef

Para verificar se o valor undef usa a função defined. O valor é undef se a função defined retorna false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

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

É muito fácil escrever сабу is_undef, que vai retornar a verdade se entregaram 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';
}

Mas mais frequentemente do que não fazem, e usam o recurso de defined , sem qualquer subordinação.

Não existe outra maneira de como pode-se verificar que a variável contém undef é usar o operador ~~ (este operador é chamado de smartmatch). Este operador apareceu em Perl 5.10, mas a partir da versão Perl 5.18 o uso deste operador emite um aviso Smartmatch is experimental at script.pl line 8.. Aqui está um exemplo de código com este operador:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

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

Mais frequentemente do que a melhor maneira é a verificação de undef é a função defined.

Perl undef e conversão para JSON

Biblioteca para trabalhar com JSON no Perl convertem Perl valor undef em null em JSON:

▶ Run
#!/usr/bin/perl

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

print encode_json {
    a => undef,
};

Este código irá imprimir na tela {"a":null}.

E vice-versa, quando a conversão de JSON null torna-se undef:

▶ Run
#!/usr/bin/perl

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

print Dumper decode_json '[null]';

Este código irá imprimir na tela:

$VAR1 = [
          undef
        ];

A função ref

O resultado do trabalho da função ref aplicada ao undef é uma cadeia de caracteres vazia ''. Neste plano undef não é diferente de linhas e números. Para undef, linhas e números com a função de ref retorna a string vazia:

▶ Run
#!/usr/bin/perl

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

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

Um valor booleano

Quando você usa o undef , em unidades lógicas, operações undef — isso é uma mentira. Este código irá a tela de texto false:

▶ Run
#!/usr/bin/perl

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

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

O uso de cadeias de caracteres

No caso de se usar undef em operações com cadeias de caracteres, então em vez de undefserá usado uma seqüência de caracteres vazia '', mas também será mostrado um aviso.

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

No primeiro caso, será mostrado um aviso Use of uninitialized value in concatenation (.) or string at script.pl line 10., no segundo caso, Use of uninitialized value in string eq at script.pl line 8..

A utilização de números

No caso de se usar undef operações com números, em vez de undefserá usado o número de 0. mas, assim como será mostrado um aviso.

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

No primeiro caso, será mostrado um aviso Use of uninitialized value $var in addition (+) at script.pl line 8., no segundo caso, Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Interessante que quando você usa o operador de incremento ++ aviso não:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Temas relacionados

Outros artigos