Perl,将哈希转换为数组

Mik*_*ike 20 arrays perl hash

如果我在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)

  • 或者避免在void上下文中使用map:$ array [$ _] = $ hash {$ _} for keys%hash; (6认同)
  • 那必须是'sort {$ a <=> $ b}`.请记住,`sort`默认为字符串比较. (3认同)