Se undef ser a chave de hash em Perl?

Resposta — não.

undef não pode ser uma chave de hash em Perl. Mas há sutilezas que pode ocorrer a impressão de que pode. Mais detalhes abaixo.

O que é um hash

Uma das estruturas de dados, que existe na linguagem de programação Perl — é hash. O hash é desordenado conjunto de pares de valores. Aqui está um exemplo de um hash:

my %h = (
    aa => 1,
    bb => 2,
);

Neste хеше é armazenado dois pares de valores. Em uma chave com o nome 'aa' o valor armazenado 1, e em uma chave com o nome 'bb' o valor armazenado 2. Para obter esses valores, usam a sintaxe $h{aa} e $h{bb}.

O que é undef

undef é um significado especial em Perl, o que significa a ausência de valores. Se criar uma variável, mas não é atribuído nenhum valor, o seu valor será a vez de undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

O programa exibirá o texto $VAR1 = undef;.

undef ainda pode-se recorrer ao que não existe um elemento de uma matriz ou a que não existe chave na хеше. Você pode atribuir explicitamente undef variável: $var = undef;.

Um erro de ortografia para a utilização de 1

Aqui está um exemplo de programa a partir do qual parece que undef pode ser a chave de hash:

▶ Run
#!/usr/bin/perl

my %h = (
    undef => 'asdf',
);

print $h{undef};

O programa exibe na tela o texto asdf. Т. е. como se nós criamos хеше chave undef, e então achem o valor padrão para essa chave. Mas não é assim. Neste exemplo, o valor armazenado na chave de 'undef', т. е. linha 'undef', e não o verdadeiro undef.

Assim ocorre devido a duas características.

Quando você cria um hash criamos nele um par chave-valor com o código undef => 'asdf',. Este código usa o operador de =>. Característica deste a instrução é que, em algumas situações ele pode perceber o que está à esquerda como uma seqüência de caracteres. É como se estivesse conclui aquele que está à esquerda do => entre aspas. undef => 'asdf', é, na verdade, 'undef' => 'asdf',.

A segunda característica é a forma como nós достаем o valor de hash de chave. Nós usamos a sintaxe $h{undef}. E aqui Perl acredita que o que está entre colchetes é uma seqüência de caracteres. Que a gente escreveu aqui é a mesma coisa que $h{'undef'}.

Você pode ter certeza de que é realmente assim se executar o script, ligando um módulo especial, que em vez de executar o código, mostra como Perl entender este código. perl -MO=Deparse script.pl. Eis a saída:

my(%h) = ('undef', 'asdf');
print $h{'undef'};
script.pl syntax OK

Um erro de ortografia para a utilização de 2

Aqui está um exemplo de código a partir do qual, equivocadamente, parece que undef pode ser a chave hash. Tão lindo nós usamos o presente undef, e não a linha 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

my %h = (
    $var => 'asdf',
);

print $h{$var};

O programa exibe na tela o texto asdf. Т. е. realmente parece que nós criamos o valor em хеше chave undef.

Mas, na verdade, nós colocamos um valor na chave de '' (string vazia). Se escrever mais no final deste programa linha use Data::Dumper e warn Dumper \%h;, após a inicialização a tela será visto como realmente se parece com um hash:

$VAR1 = {
          '' => 'asdf'
        };

A variável $var contém em si o valor undef, mas quando usado em $var => 'asdf', e $h{$var} undef é substituído por uma linha em branco ''.

Se você adicionar o código use strict; e use warnings; (que quase sempre vale a pena fazer), na saída do programa será visto que o Perl adverte sobre este uso:

Use of uninitialized value $var in list assignment at script.pl line 8.
Use of uninitialized value $var in hash element at script.pl line 12.

Resumo

undef não pode ser um valor de chave em Perl хеше. Chaves em Perl хеше é sempre de comando. (Só para esclarecer, que uma cadeia de caracteres vazia '' também pode ser a chave). E os valores em хеше podem ser completamente todas e lá, sem problemas pode ser undef.

Outros artigos