web-dev-qa-db-fra.com

Comment créer des tableaux multidimensionnels en Perl?

Je suis un peu nouveau sur Perl, mais voici ce que je veux faire:

my @array2d;
while(<FILE>){
  Push(@array2d[$i], $_);
}

Il ne compile pas puisque @array2d[$i] n'est pas un tableau mais une valeur scalaire.

Comment dois-je déclarer @ array2d en tant que tableau de tableau?

Bien sûr, je n'ai aucune idée du nombre de lignes que j'ai.

18
Ben

Pour créer un tableau de tableaux, ou plus précisément un tableau de tableaux, essayez quelque chose comme ceci: 

my @array = ();
foreach my $i ( 0 .. 10 ) {
  foreach my $j ( 0 .. 10 ) {
    Push @{ $array[$i] }, $j;
  }
}

Il pousse la valeur sur un tableau référencé déréférencé pour vous. Vous devriez pouvoir accéder à une entrée comme celle-ci: 

print $array[3][2];
27
gpojd

Changez votre ligne "Push" en ceci:

Push(@{$array2d[$i]}, $_);

En gros, vous faites de $ array2d [$ i] un tableau en l’entourant de @ {} ... Vous pouvez alors insérer des éléments dans ce tableau de références de tableaux.

8
BrianH

Examinez les commandes perlref et perldsc pour savoir comment créer des structures de données imbriquées, telles que des tableaux de tableaux et des hachages de hachages. Des choses très utiles quand vous faites du Perl.

6
Paul Tomblin

Il n'y a vraiment aucune différence entre ce que vous avez écrit et ceci: 

@{$array2d[$i]} = <FILE>;

Je ne peux que supposer que vous parcourez des fichiers. 

Pour éviter de garder la trace d'un compteur, vous pouvez procéder comme suit: 

...
Push @array2d, [ <FILE> ];
...

Cela signifie 1) créer une référence à un tableau vide, 2) stocker toutes les lignes dans FILE, 3) le placer dans @array2d.

3
Axeman

Si vous essayez simplement de stocker un fichier dans un tableau, vous pouvez également le faire:

fopen(FILE,"<somefile.txt");
@array = <FILE>;
close (FILE);
0
slm

Un autre moyen simple consiste à utiliser une table de hachage et à utiliser les deux index de tableau pour créer une clé de hachage:

$two_dimensional_array{"$i $j"} = $val;
0
Nathan Fellman