6

给定 Perl 中的散列(任何散列),我如何从该散列中提取值,按照它们添加的顺序并将它们放入数组中?

例子:

my %given = ( foo => '10', bar => '20', baz => '15' );

我想得到以下结果:

my @givenValues = (10, 20, 15);
4

4 回答 4

17

来自perldoc perlfaq4如何让我的哈希记住我将元素放入其中的顺序?


使用Tie::IxHash来自 CPAN 的。

use Tie::IxHash;
tie my %myhash, 'Tie::IxHash';

for (my $i=0; $i<20; $i++) {

    $myhash{$i} = 2*$i;
}

my @keys = keys %myhash;
# @keys = (0,1,2,3,...)
于 2010-08-03T13:49:24.497 回答
5

以下将做你想要的:

my @orderedKeys = qw(foo bar baz);
my %records     = (foo => '10', bar => '20', baz => '15');

my @givenValues = map {$records{$_}} @orderedKeys;

注意:更好的解决方案是使用Tie::IxHashTie::Hash::Indexed来保存插入顺序。

于 2010-08-03T13:27:39.737 回答
3

如果您有正确顺序的键列表,则可以使用哈希切片:

 my @keys   = qw(foo bar baz);
 my %given  = {foo => '10', bar => '20', baz => '15'}
 my @values = @given{@keys};

否则,使用Tie::IxHash.

于 2010-08-03T13:40:36.260 回答
2

您可以使用values,但我认为您无法以正确的顺序获取它们,因为在您创建哈希时顺序已经丢失了

于 2010-08-03T13:19:10.497 回答