Comment faire rétrécir un tableau en Perl?
Comment puis-je faire un tableau plus courte en Perl? J'ai lu certaines pages web indiquant que je peux attribuer:
$#ARRAY = 42;
J'ai lu que l'utilisation de $# est obsolète. J'ai besoin d'une solution qui fonctionne pour un tableau de tableaux, trop. Cela n'a pas fonctionné:
$#$ARRAY[$i] = 42;
- $# est obsolète, mais $# n'est pas le même que $#tableau. Je n'ai pas lu partout que $#tableau est obsolète, mais il est source de confusion et je recommanderais l'un contre l'utilisant.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas au courant de l'attribution
$#ARRAY
désapprouvée;perldoc perldata
de 5.10.0 certainement ne dit rien à ce sujet. C'est le moyen le plus rapide pour tronquer un tableau.Si vous voulez quelque chose d'un peu plus lisible, utilisez
splice
:(Note
43
au lieu de42
-$#ARRAY
vous obtient le dernier indice du tableau, alors quesplice
taks la longueur du tableau à la place).Comme pour travailler sur des tableaux de tableaux, je suppose que signifie être capable de tronquer un tableau imbriqué par l'intermédiaire d'une référence? Dans ce cas, vous souhaitez:
ou
Vos options sont quasi-illimitées (j'ai souligné les cinq approches ici), mais votre stratégie sera dicté par exactement ce que vos besoins et vos objectifs sont. (tous les exemples convertir @tableau n'avoir pas plus de $N éléments)
[MODIFIER]
Comme d'autres l'ont souligné, le chemin suggéré dans la question d'origine n'est pas réellement obsolète, et il est le plus rapide, tersest, mais pas nécessairement la solution la plus lisible. Il a aussi pour effet de bord de l'expansion d'un tableau de moins de $N éléments avec les éléments vides:
Moins de code:
Plus efficace pour la coupe d'un petit nombre d'un grand tableau:
Indésirables dans presque tous les cas, sauf si vous aimez vraiment les supprimer():
Utile si vous avez besoin du reste de la liste dans l'ordre inverse:
Utile pour gagner du temps dans le long terme:
La
$#
variable est obsolète, mais la$#array
fonctionnalité n'est pas.D'utiliser le
$#array
de la syntaxe d'une expression arbitraire qui donne un tableau de référence, ne$#{ EXPR }
.Voir l'inestimable: http://perlmonks.org/?node=References+rapide+référence
Vous essentiellement a donné la réponse canonique vous-même. Vous raccourcir un tableau en paramètre le dernier indice:
L' $#Foo notation pour désigner le dernier indice du tableau est absolument pas obsolète. De même, l'affectation à il ne sera pas obsolète soit. Citant le perldata documentation:
Utilisé seul
$#{$array[3]} = 9;
attribue une longueur de 9 à la autovivified tableau $array[3].
En cas de doute, utilisez Data::Dumper:
$#{$TABLEAU[$i]} = 42;
Vous pourriez faire
Il y a deux façons d'interpréter la question.
La plupart des réponses jusqu'à présent se concentrer sur l'ancien. À mon avis, la meilleure réponse à ce qui est le épissure fonction. Par exemple, pour supprimer 10 éléments à partir de la fin:
Toutefois, en raison de la façon dont Perl gère la mémoire pour les tableaux, la seule façon de s'assurer qu'un tableau prend moins de mémoire est à copier dans un nouveau tableau (et de laisser le souvenir de l'ancien tableau être récupérée). Pour cela, j'aurais tendance à penser à l'aide d'un tranche opération. E. g., pour supprimer 10 éléments:
Voici une comparaison de différentes approches pour un 500 élément de tableau (à l'aide de 2104 octets):
Vous pouvez voir que la tranche de l'opération (copié dans un nouveau tableau) a un plus petit taille que l'original.
Voici le code que j'ai utilisé pour cette analyse: