Question

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

$histogram{

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

<*>

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

}++; }

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

} = $histogram{

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{

Voici quelques exemples simples de Perl pour compter le nombre de fois qu’une valeur apparaît dans un tableau. Cela fonctionne sans aucun avertissement.

<*>

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

}++; }

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

} + 1;

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

}++; }

Lorsque le corps de la boucle est remplacé par

<*>

Avertit Perl "Utilisation de la valeur non initialisée en plus".

Que se passe-t-il sous le capot? Pourquoi la valeur est-elle initialisée lorsqu’elle est fournie en tant qu’opérande à l’opérateur ++ et non initialisée avec l’opérateur +?

Était-ce utile?

La solution

L'opérateur + évalue à la fois le formulaire à gauche et le formulaire à droite, puis renvoie la somme des deux. L'évaluation des appels de hachage ne voit pas de contexte particulier.

L'opérateur ++ possède une magie particulière. Citant la page de manuel perlop concernant l'opérateur ++:

  

" undef " est toujours traité comme numérique, et en particulier il est remplacé par 0 avant incrémentation (de sorte qu'une post-incrémentation d'une valeur undef renvoie 0 plutôt que "undef").

edit : Pour préciser la différence, ++ modifie la valeur en place, tandis que + prend simplement ses arguments en entrée. Lorsque + voit une valeur indéfinie, quelque chose s'est mal passé, mais pour ++, votre exemple de manipulation de hachage est très typique: l'utilisateur souhaite traiter undef comme 0, au lieu de devoir vérifier et initialiser à chaque fois. Il semble donc logique de traiter ces opérateurs de cette manière.

Autres conseils

Ce n'est pas que Perl initialise nécessairement les valeurs, mais qu'il n'en avertit pas toujours. N'essayez pas de penser à une règle pour cela car vous rencontrerez toujours des exceptions, et juste quand vous penserez l'avoir comprise, la prochaine version de Perl changera les avertissements qui vous sont adressés.

Dans ce cas, comme l'a dit Harleqin, les opérateurs d'incrémentation automatique ont un cas particulier.

Certains opérateurs omettent délibérément l'option "non initialisé". avertissement pour votre commodité parce qu’ils sont couramment utilisés dans des situations où un 0 ou un " La valeur par défaut pour l'opérande gauche ou unique est logique.

Ce sont: ++ et - (pré ou post), + =, - =,. =, | =, ^ =, & amp; & amp; =, || =.

Notez que certains d'entre eux donnent à tort l'avertissement lorsqu'ils sont utilisés sur une variable liée: voir les tests marqués TODO dans http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t .

Comme Brian l'a mentionné: il le fait toujours, il vous avertit simplement. Les avertissements vous informent de certaines manipulations avec des effets que vous n’auriez peut-être pas prévus.

Vous demandez spécifiquement la valeur de $ histogram {$ _} , en lui ajoutant 1, puis en l'attribuant au même emplacement. Je ne m'attendrais pas à ce que l'autovivification fonctionne ici de la même manière:

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

comme ici:

$hash_for{$key_level_1}{$key_level_2} = $value;

La magie ne fonctionne probablement pas comme l'optimisation. Et optimiser le compilateur remarquerait que a = a + 1 est la même chose que a ++ , de sorte que s'il existait un opérateur d'incrémentation dans le langage d'assemblage, il pourrait utiliser cette instruction optimisée à la place. de prétendre qu'il doit conserver la première valeur, puis de l'écraser, car ce n'est pas réellement nécessaire.

L’optimisation est un examen minutieux et une surcharge une fois pour améliorer les performances à chaque exécution. Mais dans un langage dynamique, rien ne garantit que vous n’ajoutez pas de frais généraux au même rythme que vous auriez sinon essayé de les réduire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top