2

您将如何从散列数组中推送数组中的每个 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

4

2 回答 2

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";

但是你可以在没有 push 的情况下更轻松地实现相同的目标:

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)。

于 2012-05-10T19:08:11.990 回答
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";

你可以在 Ideone 上测试这个脚本

于 2012-05-10T19:23:31.613 回答