Peut - undef être la clé de hachage en Perl?

La réponse ne l'est pas.

undef ne peut pas être la clé de hachage en Perl. Mais il y a des subtilités qui peut avoir l'impression qu'on peut. Plus de détails ci-dessous.

Qu'est-ce que le hachage

L'une des structures de données qui existe dans le langage de programmation Perl est un hash. Le hachage est une un ensemble de paires de valeurs. Voici un exemple de hachage:

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

Cette hachage est stocké deux paires de valeurs. Dans la clé avec le nom 'aa' valeur stockée 1, et dans la clé avec le nom 'bb' à valeur stockée 2. Pour obtenir ces valeurs, utilisent la syntaxe de la $h{aa} et $h{bb}.

Qu'est-ce que undef

undef est une valeur spéciale en Perl, ce qui signifie l'absence de valeurs. Si créer une variable, mais ne lui donner aucune valeur, alors elle sera juste undef:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my $var;

print Dumper $var;

Le programme affichera le texte $VAR1 = undef;.

undef pouvez-vous obtenir si vous accédez à un élément de tableau ou de la supprimé la clé de hachage. Vous pouvez assigner explicitement undef de la variable: $var = undef;.

Contestant l'utilisation 1

Voici un exemple de programme à partir de laquelle il semble que undef peut être la clé de hachage:

▶ Run
#!/usr/bin/perl

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

print $h{undef};

Le programme affiche le texte asdf. C'est-à-dire comme si nous l'avons créé dans le hachage de la clé undef, et ont pris ensuite la valeur de cette clé. Mais ce n'est pas le cas. Dans cet exemple, la valeur est stockée dans la clé de 'undef', c'est-à-dire la chaîne de 'undef', et pas un vrai undef.

C'est-à raison de deux caractéristiques.

Lors de la création de hachage, nous avons créé un couple clé-valeur avec l'aide d'un code undef => 'asdf',. Ce code utilise l'opérateur =>. La particularité de cette l'opérateur dans le fait que, dans certaines situations, il peut percevoir ce qui se trouve à gauche, comme une chaîne. Il conclut que se trouve à la gauche de => entre guillemets. undef => 'asdf', c'est en fait 'undef' => 'asdf',.

La deuxième caractéristique — c'est ce que nous choisissons une valeur de hachage de la clé. Nous utilisons la syntaxe $h{undef}. Et ici, Perl estime que ce qui se trouve entre les accolades est une chaîne. Ce que nous avez écrit ici, c'est la même chose que la $h{'undef'}.

Vous pouvez vous assurer que c'est vraiment le cas si vous exécutez le script, en branchant un module spécial, qui au lieu d'exécution de code montre comment Perl comprend pas ce code. perl -MO=Deparse script.pl. Voici la conclusion:

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

Contestant l'utilisation de 2

Voici un autre exemple de code à partir de laquelle, à tort semble que undef peut être la clé de hachage. Vraiment alors nous utilisons un vrai undef, pas de ligne 'undef':

▶ Run
#!/usr/bin/perl

my $var = undef;

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

print $h{$var};

Le programme affiche le texte asdf. C'est à dire, il semble vraiment que nous, nous avons créé la valeur dans le hachage de la clé undef.

Mais en fait, nous avons placé la valeur dans la clé '' (chaîne vide). Si d'ajouter à la fin de ce programme de la chaîne use Data::Dumper et warn Dumper \%h;, puis après un démarrage à l'écran sera visible à quoi ressemble vraiment hash:

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

La variable $var contient la valeur undef, mais lors d'une utilisation $var => 'asdf', et $h{$var} undef est remplacé par une chaîne vide ''.

Si vous ajoutez le code use strict; et use warnings; (ce qui est pratiquement toujours la peine de le faire), alors dans le résultat du programme sera visible que Perl avertit de l'utilisation de cette:

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.

Résumé

undef ne peut pas être une valeur de la clé en Perl hachage. Les clés en Perl hachage est toujours en ligne. (Précisons seulement que la chaîne vide '' peut aussi être la clé). Et les valeurs de hachage peuvent être tout à fait toutes là, aucun problème ne peut être undef.

Autres articles