2012-05-10 29 views
2

你將如何從一個哈希數組中推送數組中的每個id值?在Perl中,如何從hashrefs數組中提取ID字段的列表?

我有這樣的數組:

@friends = [ 
    {'id' => 1, 'last_name' => 'Fo', 'first_name' => 'fa' }, 
    {'id' => 3, 'last_name' => 'pa', 'first_name' => 'pi' }, 
    {'id' => 2, 'last_name' => 'ma', 'first_name' => 'mi' } 
]; 

我想創造價值的id像這樣的數組:@friend_ids = [1, 3, 2],使用push

+0

可能用'map' - 像'map {push @friend_ids,$$ _ {id}} @friends;'。現在無法測試,因此我不想回答。 –

回答

10

您可能有@friends = (...)並且想要@friend_ids = (1, 3, 2)。方括號用於數組引用,而不是列表。 您可以創建這樣那樣的數組:

#!/usr/bin/perl 
use warnings; 
use strict; 

my @friends = ({id => 1, last_name => 'Fo', first_name => 'fa' }, 
       {id => 3, last_name => 'pa', first_name => 'pi' }, 
       {id => 2, last_name => 'ma', first_name => 'mi' }); 
my @friend_ids; 
push @friend_ids, $_->{id} for @friends; 
print "@friend_ids\n"; 

但是你可以不推達到同樣更容易:

my @friend_ids = map $_->{id}, @friends; 

如果您需要刪除重複,並且鍵排序,你可以使用:

my @friend_ids = sort {$a <=> $b} uniq map $_->{id}, @friends; 

如果所有的ID是數字或只是

my @friend_ids = sort uniq map $_->{id}, @friends; 

如果某些ID不是數字(uniq來自List::MoreUtils)。

+2

這種推送方法是:''推@friend_ids,@ _-> {id}爲@friends;''或«'推圖$ _-> {id},@friend_ids;'»。沒有理由同時使用'map'和'for'。 – ikegami

+0

@ikegami:更正了,謝謝。從命令行重新調整代碼... – choroba

+0

哇謝謝你們都 – mamesaye

2

我會使用散列爲,以消除重複,使結果容易排序(如果需要):

my @friends = ({id => 1, last_name => 'Fo', first_name => 'fa' }, 
       {id => 3, last_name => 'pa', first_name => 'pi' }, 
       {id => 2, last_name => 'ma', first_name => 'mi' }); 

my %id = map { $_->{id} => 1 } @friends; 
my @friend_ids = sort { $a <=> $b } (keys %id); 
print "@friend_ids\n"; 

你可以test this script on Ideone

+0

由於id是數字,你應該使用數字排序。另外,請注意'my%id = map {$ _-> {id} => 1} @friends;' –

+0

@SinanUnur - 謝謝優化... –

+0

這個問題不需要排序,所以使用中間散列就是資源浪費。 – dolmen