Il y a deux façons d'interpréter la question.
- Comment réduire la longueur de la matrice?
- Comment réduire la quantité de mémoire consommée par la baie?
La plupart des réponses se concentrent jusqu'à présent sur le premier. À mon avis, la meilleure réponse à cela est la fonction épissure. Par exemple, pour éliminer les 10 éléments de la fin:
splice @array, -10;
Cependant, en raison de la façon dont Perl gère la mémoire pour les tableaux, la seule façon de garantir qu'un réseau prend moins de mémoire est de le copier dans un nouveau tableau (et que la mémoire de l'ancien tableau soit récupérée). Pour cela, j'aurais tendance à penser à utiliser une opération tranche. Par exemple, pour supprimer 10 éléments:
@new = @old[ 0 .. $#old - 10 ]
Voici une comparaison des différentes approches pour un ensemble d'éléments 500 (en utilisant 2104 octets):
original: length 500 => size 2104
pound: length 490 => size 2208
splice: length 490 => size 2104
delete: length 490 => size 2104
slice: length 490 => size 2064
Vous pouvez voir que seule l'opération de découpage (copié sur un nouveau tableau) a une taille inférieure à que l'original.
Voici le code que j'utilisé pour cette analyse:
use strict;
use warnings;
use 5.010;
use Devel::Size qw/size/;
my @original = (1 .. 500);
show('original', \@original);
my @pound = @original;
$#pound = $#pound - 10;
show('pound', \@pound);
my @splice = @original;
splice(@splice,-10);
show('splice', \@splice);
my @delete = @original;
delete @delete[ -10 .. -1 ];
show('delete', \@delete);
my @slice = @original[0 .. $#original - 10];
show('slice', \@slice);
sub show {
my ($name, $ref) = @_;
printf("%10s: length %4d => size %d\n", $name, scalar @$ref, size($ref));
}
$ # est dépréciée, mais # $ n'est pas la même chose que le tableau $ #. Je n'ai lu nulle part que le tableau $ # est obsolète, même s'il est confus et je recommanderais de ne pas l'utiliser. –