Initialisation des tableaux dans Perl

Comment initialiser un tableau à 0?

j'ai essayé ceci.

my @arr = ();

mais il me lance toujours un avertissement,"Utilisation de la valeur non initialisée". Je ne sais pas la taille du tableau avant. Je le remplis dynamiquement. Je croyais que le code ci-dessus devait initialiser à 0.

Comment dois-je faire?

20
demandé sur Peter Mortensen 2010-07-15 03:57:56

3 réponses

si je vous comprends, peut-être que vous n'avez pas besoin d'un tableau de zéros; plutôt, vous avez besoin d'un hash. Les clés de hachage seront les valeurs dans l'autre tableau et les valeurs de hachage sera 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 peuplé d'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.
48
répondu FMc 2010-07-15 19:16:11

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

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

Êtes-vous sûr d'avoir une erreur à partir de cette ligne, et pas ailleurs dans votre code? Vous assurer que vous avez use strict; use warnings; dans votre module ou script, et vérifiez le numéro de ligne de l'erreur que vous obtenez. (Afficher du code contextuel ici pourrait aussi aider.)

15
répondu Ether 2010-07-15 00:03:37

Pour produire la sortie de votre commentaire sur votre message, cela 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

ceci est différent de votre algorithme déclaré de production d'un tableau parallèle avec des valeurs zéro, 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 que.

3
répondu dawg 2010-07-15 15:22:34