2010-06-15 42 views
7

Giả sử trong Perl tôi có danh sách các tham chiếu băm và mỗi trường bắt buộc phải chứa một trường nhất định, giả sử foo. Tôi muốn tạo một danh sách chứa tất cả các ánh xạ của foo. Nếu có băm không chứa foo thì quá trình sẽ không thành công.Perl, nhận tất cả giá trị băm

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

my @list =(); 
foreach my $item (@hash_list) { 
    push(@list,$item->{foo}); 
} 

#list should be (1,2); 

Có cách nào ngắn gọn hơn để thực hiện việc này trong Perl không?

+1

Tôi chỉ muốn làm rõ bạn không tạo danh sách ánh xạ, bạn đang tạo danh sách bao gồm mỗi giá trị băm 'foo'. Và ví dụ mã của bạn không liên quan gì đến 'quá trình không thành công' để bạn 'không chỉ yêu cầu súc tích hơn. –

+1

Nói chung: bất cứ khi nào bạn thấy mình đang làm 'foreach ... {... push ..}' bạn có thể làm cho mã ngắn hơn và đơn giản hơn bằng cách sử dụng bản đồ hoặc grep. – Ether

Trả lời

6

Có. có.

my @list = map { 
    exists $_->{foo} ? $_->{foo} : die 'hashed lacked foo' 
    } 
    @hash_list 
; 
+0

cho các biểu thức phức tạp như thế này, nó thường dễ đọc hơn bằng cách sử dụng cú pháp khối thay vì biểu thức trần –

+0

đó là +1 tốt hơn, tôi sử dụng cú pháp trống tất cả thời gian cho các biểu thức ngắn, có lẽ là nhận được một khối là trường hợp của một bản đồ trả về mảng array: 'map [...] => ...' –

0
if (@hash_list != grep { exists $_->{foo} } @hash_list) { 
    # test failed 
} 
1

Evan của câu trả lời là gần, nhưng sẽ trở lại với hashrefs chứ không phải là giá trị của foo.

my @list = map $_->{foo} grep { exists $_->{foo} } @hash_list 
+0

Yea, tôi đã sửa lỗi này. và, tôi cũng làm cho nó chết, có một ngắt kết nối giữa mã của anh ta và câu hỏi của anh ta. Bạn cũng có thể làm điều này với một vòng lặp. –

2

Bạn có thể sử dụng chức năng bản đồ cho việc này:

@hash_list = (
{foo=>1}, 
{foo=>2} 
); 

@list = map($_->{foo}, @hash_list); 

đồ áp dụng các chức năng trong các đối số đầu tiên trên tất cả yếu tố của số thứ hai.

grep cũng rất hay để lọc các phần tử trong danh sách và hoạt động theo cùng một cách.

Các vấn đề liên quan