Есть два способа интерпретации вопроса.
- Как уменьшить длину массива?
- Как уменьшить объем памяти, используемой массивом?
Большинство ответов до сих пор сосредоточены на первом. На мой взгляд, лучшим ответом на это является функция splice . Например, чтобы удалить 10 элементов с конца:
splice @array, -10;
Однако из-за того, как Perl управляет памятью для массивов, единственный способ гарантировать, что массив занимает меньше памяти, - это скопировать его в новый массив (и позволить памяти старого массива освободиться). Для этого я бы подумал об использовании операции slice . Например, чтобы удалить 10 элементов:
@new = @old[ 0 .. $#old - 10 ]
Вот сравнение различных подходов для массива из 500 элементов (с использованием 2104 байтов):
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
Вы можете видеть, что только операция слайса (скопированная в новый массив) имеет меньший размер , чем оригинал.
Вот код, который я использовал для этого анализа:
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));
}