2011-11-09 28 views
8

Trong Perl 5, khi chúng tôi có một mảng được đặt tên, ví dụ: @a, nhận được các yếu tố từ chỉ số $N trở đi là đơn giản với một chút slicing:Làm cách nào để lấy tất cả các phần tử từ chỉ mục N đến cuối từ một mảng Perl ẩn danh?

my @result = @a[$N..$#a]; 

Có cách nào tiêu chuẩn để làm tương tự với một mảng vô danh, mà không cần phải cung cấp độ dài một cách rõ ràng? I E. thể này:

my @result = (0,1,2,3,4,5)[2..5]; 

hay, cụ thể hơn, điều này:

my @result = (0,1,2,3,4,5)[$N..5]; 

được chuyển đổi sang một cái gì đó mà không cần phải giới hạn phạm vi trên là rõ ràng? Có lẽ một số cú pháp Perl mơ hồ? Có lẽ một chút dicing thay vì cắt?

PS: Tôi đã viết chức năng này như một chức năng - Tôi đang tìm cách tiếp cận độc lập hơn.

+0

Nếu bạn muốn cắt một mảng vô danh của '(0,1,2,3,4,5) 'vào' 2 3 4 5', vậy tại sao không chỉ viết '(2,3,4,5) 'ngay từ đầu? –

+0

@Blagovest Buyukliev: Bởi vì chỉ số bắt đầu trong trường hợp của tôi là biến. Tôi đã chỉnh sửa câu hỏi của mình để phản ánh yêu cầu này. – thkala

+0

"mảng ẩn danh" là gì? :-) –

Trả lời

17

Bạn có thể splice nó:

@result = splice @{[0..$M]}, $N; # return $N .. $M 
+0

Ah, điều này chắc chắn hoạt động! Tôi đã thử 'splice' nhưng không thể làm đúng. +1 – thkala

1

Tôi nghĩ rằng đám đông của splice là lựa chọn tốt nhất, nhưng trên tinh thần lựa chọn:

my @result = reverse ((reverse 0..5)[0..$N+1]); 

này trả về kết quả tương tự như ví dụ trên:

my @result = (0..5)[$N..5]; 
+0

Điều này trả về các mục '$ N + 1', nhưng bạn muốn' $ # {anonymous_array} - $ N' mục. –

+0

Bạn đúng rằng tôi sai, nhưng vì những lý do sai :-) – mwp

1

Bạn không cần đặt tên cho mảng nếu bạn đặt i t như topic:

 
    sub returns_array_ref {[1 .. 5]} 

    my @slice = map @$_[$n .. $#$_] => returns_array_ref; 

Hoặc nếu bạn đang làm việc với một danh sách:

 
    sub returns_list {1 .. 5} 

    my @slice = sub {@_[$n .. $#_]}->(returns_list); 
Các vấn đề liên quan