Hay dos maneras de interpretar la cuestión.
- Cómo reducir la longitud de la matriz?
- Cómo reducir la cantidad de memoria consumida por la matriz?
La mayoría de las respuestas se centran en la primera. En mi opinión, la mejor respuesta es la función de empalme . Por ejemplo, para eliminar 10 elementos desde el extremo:
splice @array, -10;
Sin embargo, debido a la forma Perl administra la memoria para las matrices, la única manera de garantizar que una matriz toma menos memoria es para copiarlo en una nueva matriz (y dejar que se recupere la memoria de la antigua matriz). Para esto, tendería a pensar en utilizar una operación de corte. Por ejemplo, para eliminar 10 elementos:
@new = @old[ 0 .. $#old - 10 ]
He aquí una comparación de los diferentes enfoques para una matriz de 500 elementos (utilizando 2104 bytes):
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
se puede ver que sólo la operación de troceado (copia en una nueva matriz) tiene un tamaño más pequeño que el original.
Aquí está el código que he usado para este análisis:
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));
}
$ # es obsoleto, pero $ # no es lo mismo que $ # matriz. No he leído en ningún lugar que $ # array está en desuso, aunque es confuso y recomendaría uno en contra de usarlo. –