2
votes

Accès aux tableaux multidimensionnels Perl

Disons que le tableau multidimensionnel est comme ceci,

print $myarray->[1][1] #prints 5
print $myarray->[1]->[1] #also prints 5
print $myarray[1][1] #prints nothing

En essayant d'y accéder de trois manières,

$myarray = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]];

Je ne peux pas figure la différence entre le premier et le deuxième type d'accès. Plus précisément, le second est plus explicite mais le premier fonctionne toujours. Cela m'oblige à penser que le troisième fonctionne mieux également (ce que je sais pas car myarray est en fait une référence et non un tableau).


2 commentaires

Lequel premier, deuxième ou troisième?


Pour le troisième, essayez print $$ myarray [1] [1]


3 Réponses :


4
votes

Les premier et deuxième exemples sont fonctionnellement équivalents. L'un n'est que du sucre syntaxique pour l'autre.

Le troisième est sémantiquement différent. Alors qu'il est acceptable d'omettre les opérateurs -> entre les index, il n'est pas acceptable de le faire entre les identifiants ou les appels de sous-programme et les index si la variable (ou sous-programme) contient (ou renvoie) une référence, car Perl les traiteront comme des non-références dans ce cas.

Il n'y a pas de situation où $ array -> [1] [2] pourrait signifier autre chose que $ array -> [1] -> [2] , mais s'il était permis d'omettre la flèche entre l'identifiant et le premier index, il serait ambigu de savoir si la structure indexée ressemblait à [1, ...] ou ( 1, ...) , qui sont des choses différentes.


1 commentaires

Notez que $ array -> [1] -> [2] est identique à @ {@ {$ myarray} [0]} [0]



2
votes

$ myarray -> [1] signifie "rechercher l'index 1 dans un tableau en utilisant la référence de tableau stockée dans $ myarray ".

$ myarray [1] signifie "rechercher l'index 1 dans le tableau @myarray ".

Les deux variables $ myarray et @myarray n'ont aucune connexion.


0 commentaires

3
votes

Trois points

  1. $ myarray contient une référence de tableau, pas un tableau.
  2. $ mayarray et @myarray sont des variables différentes
  3. Perl ne fait pas vraiment de tableaux multidimensionnels

Toutes les références sont conservées dans des scalaires, donc toutes les références sont conservées dans des variables qui commencent par $.

Le [...] crée une référence de tableau anonyme afin que [[1, 2, 3], [4, 5, 6], [7, 8, 9]] crée une référence de tableau anonyme contenant 3 anonymes des références de tableau contenant chacune 3 scalaires.

Cela signifie que l'affectation à $ myarray lui attribue la référence de tableau anonyme externe.

Dans l'ordre, deux accèdent à ce qu'une référence pointe vers deux vous besoin de le déréférencer. Vous pouvez le faire en plaçant le symbole du type de ce à quoi la référence pointe devant la référence comme @ $ myarray . Donc $$ myarray [0] est le premier élément du tableau anonyme contenu dans la référence $ myarray ou vous pouvez utiliser la syntaxe indirecte $ myarray -> [ 0] .

Dans votre exemple, $ myarray -> [0] contient la référence du tableau [1,2,3] Donc cela peut être dé-référencé de la même manière en donnant $ myarray -> [0] -> [0] Cela dit déréférencer $ myarray et me donner le premier élément, qui est une référence de tableau, puis déréférencer cela et me donner le premier élément de celui-ci.

Ceci donne votre deuxième exemple.

Perl vous permet de supprimer le -> code > entre ] et [ ainsi que } et { pour les hachages anonymes, comme sucre syntaxique. Cela donne $ myarray -> [0] [0] qui est votre premier exemple.

Votre troisième exemple recherche le premier élément de @myarray code > qui est une variable différente de $ myarray . si vous aviez mis use strict en haut de votre script, Perl aurait détecté cette erreur pour vous.

C'est une bonne idée de mettre

use strict;
use warnings;

Comme les deux premières lignes de tout script ou module Perl, car elles captureront une multitude d'erreurs mauvaises et potentiellement fatales dans votre programme. Si vous déboguez un programme, ajouter use diagnostics sous use strict donne des messages plus détaillés.


1 commentaires

Note mineure: alors que @ $ myarray est la façon dont vous le déréférencer en tant que tableau, déréférencer et accéder à un élément serait $$ myarray [0] , ce qui équivaut alors à la notation de la flèche. De la même manière que vous utilisez @array et $ array [0] .