如果我在Perl中有一个包含完整和顺序整数映射的哈希(即,从0到n的所有键都被映射到某个东西,除此之外没有键),是否有将其转换为数组的方法?
我知道我可以遍历键/值对并将它们放入一个新的数组,但有些东西告诉我应该有一个内置的方法来做到这一点.
Eth*_*her 22
如果您的原始数据源是哈希:
# first find the max key value, if you don't already know it:
use List::Util 'max';
my $maxkey = max keys %hash;
# get all the values, in order
my @array = @hash{0 .. $maxkey};
Run Code Online (Sandbox Code Playgroud)
或者,如果您的原始数据源是hashref:
my $maxkey = max keys %$hashref;
my @array = @{$hashref}{0 .. $maxkey};
Run Code Online (Sandbox Code Playgroud)
使用此示例很容易测试:
my %hash;
@hash{0 .. 9} = ('a' .. 'j');
# insert code from above, and then print the result...
use Data::Dumper;
print Dumper(\%hash);
print Dumper(\@array);
$VAR1 = {
'6' => 'g',
'3' => 'd',
'7' => 'h',
'9' => 'j',
'2' => 'c',
'8' => 'i',
'1' => 'b',
'4' => 'e',
'0' => 'a',
'5' => 'f'
};
$VAR1 = [
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j'
];
Run Code Online (Sandbox Code Playgroud)
Rob*_*edy 16
您可以使用以下values
函数从哈希中提取所有值:
my @vals = values %hash;
Run Code Online (Sandbox Code Playgroud)
如果您希望它们按特定顺序排列,那么您可以按所需顺序放置密钥,然后从中获取哈希切片:
my @sorted_vals = @hash{sort { $a <=> $b } keys %hash};
Run Code Online (Sandbox Code Playgroud)
DVK*_*DVK 13
好吧,这不是"内置"但是有效.这也是恕我直言,任何涉及"排序"的解决方案都比较好,因为它更快.
map { $array[$_] = $hash{$_} } keys %hash; # Or use foreach instead of map
Run Code Online (Sandbox Code Playgroud)
否则,效率会降低:
my @array = map { $hash{$_} } sort { $a<=>$b } keys %hash;
Run Code Online (Sandbox Code Playgroud)