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).
3 Réponses :
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.
Notez que $ array -> [1] -> [2]
est identique à @ {@ {$ myarray} [0]} [0]
$ 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.
Trois points
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.
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]
.
Lequel premier, deuxième ou troisième?
Pour le troisième, essayez
print $$ myarray [1] [1]