web-dev-qa-db-fra.com

Initialisation de tableau en Perl

Comment initialiser un tableau à 0?

J'ai essayé ça.

my @arr = ();

Mais cela me lance toujours un avertissement, "Utilisation d'une valeur non initialisée". Je ne connais pas la taille du tableau au préalable. Je le remplis dynamiquement. Je pensais que le morceau de code ci-dessus était censé l'initialiser à 0.

Comment puis-je faire cela?

24
jerrygo

Si je vous comprends, vous n'avez peut-être pas besoin d'un tableau de zéros; vous avez plutôt besoin d'un hachage. Les clés de hachage seront les valeurs de l'autre tableau et les valeurs de hachage seront le nombre de fois que la valeur existe dans l'autre tableau:

use strict;
use warnings;

my @other_array = (0,0,0,1,2,2,3,3,3,4);
my %tallies;
$tallies{$_} ++ for @other_array;

print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;    

Sortie:

0 => 3
1 => 1
2 => 2
3 => 3
4 => 1

Pour répondre plus directement à votre question spécifique, pour créer un tableau rempli avec un tas de zéros, vous pouvez utiliser la technique dans ces deux exemples:

my @zeroes = (0) x 5;            # (0,0,0,0,0)

my @zeroes = (0) x @other_array; # A zero for each item in @other_array.
                                 # This works because in scalar context
                                 # an array evaluates to its size.
51
FMc

Qu'entendez-vous par "initialiser un tableau à zéro"? Les tableaux ne contiennent pas "zéro" - ils peuvent contenir "zéro élément", ce qui équivaut à "une liste vide". Ou, vous pourriez avoir un tableau avec un élément, où cet élément est un zéro: my @array = (0);

my @array = (); devrait très bien fonctionner - il alloue un nouveau tableau appelé @array, puis lui attribue la liste vide, (). Notez que cela revient à dire simplement my @array;, puisque la valeur initiale d'un nouveau tableau est de toute façon la liste vide.

Êtes-vous sûr que vous obtenez une erreur de cette ligne, et pas ailleurs dans votre code? Assurez-vous d'avoir use strict; use warnings; dans votre module ou script, et vérifiez le numéro de ligne de l'erreur que vous obtenez. (La publication d'un code contextuel ici pourrait également aider.)

18
Ether

Pour produire la sortie dans votre commentaire à votre message, cela le fera:

use strict;
use warnings;

my @other_array = (0,0,0,1,2,2,3,3,3,4);
my @array;
my %uniqs;

$uniqs{$_}++ for @other_array;

foreach (keys %uniqs) { $array[$_]=$uniqs{$_} }

print "array[$_] = $array[$_]\n" for (0..$#array);

Sortie:

   array[0] = 3
   array[1] = 1
   array[2] = 2
   array[3] = 3
   array[4] = 1

C'est différent de votre algorithme déclaré de produire un tableau parallèle avec des valeurs nulles, mais c'est une façon plus Perly de le faire ...

Si vous devez avoir un tableau parallèle de la même taille que votre premier tableau avec les éléments initialisés à 0, cette instruction le fera dynamiquement: @array=(0) x scalar(@other_array); mais vraiment, vous n'avez pas besoin de le faire.

3
dawg