Tôi đã viết các module List::Gen trên CPAN cung cấp một cách khác để làm điều này:
use List::Gen qw/by/;
my @array = qw/zero one two three four five six/;
my @slice = map {$$_[0]} by 2 => @array;
by
phân vùng @array
thành các nhóm hai phần tử và trả về một mảng các tham chiếu mảng. map
sau đó nhận danh sách này, vì vậy mỗi $_
trong bản đồ sẽ là tham chiếu mảng. $$_[0]
(cũng có thể được viết $_->[0]
) sau đó lấy phần tử đầu tiên của mỗi nhóm mà đã tạo ra by
.
Hoặc, sử dụng mapn
chức năng mà by
sử dụng trong nội bộ:
use List::Gen qw/mapn/;
my @slice = mapn {$_[0]} 2 => @array;
Hoặc, nếu danh sách nguồn của bạn là rất lớn và bạn có thể chỉ cần một số yếu tố, bạn có thể sử dụng List::Gen
's danh sách lười biếng:
use List::Gen qw/by gen/;
my $slicer = gen {$$_[0]} by 2 => @array;
$slicer
hiện là danh sách lười (một tham chiếu mảng) sẽ tạo ra các lát theo yêu cầu mà không cần xử lý bất kỳ thứ gì bạn không yêu cầu. $slicer
cũng có một loạt các phương thức accessor nếu bạn không muốn sử dụng nó như là một ref mảng.
Nguồn
2010-10-13 16:16:55
Chỉ cần lưu ý rằng nếu bạn có một mảng trống, phương thức này sẽ thêm một mục (trống) vào nó (sao cho mảng mới không còn kích thước 0). – insaner