通过列表中的键值配对创建哈希

时间:2014-11-10 12:24:28

标签: perl hash perl-data-structures

以下是代码:

#!/usr/bin/perl

my %hash = (1..20);

foreach (sort {$a <=> $b} keys %hash)
{
  print "\n$_ -> $hash{$_} ";
}

输出:

1 -> 2 
3 -> 4 
5 -> 6 
7 -> 8 
9 -> 10 
11 -> 12 
13 -> 14 
15 -> 16 
17 -> 18 
19 -> 20 

Perl选择第一个元素作为键,将下一个元素作为值。也就是说,列表的替代值被视为键。并且其间的价值为其价值。

是否可以控制此分配?

喜欢 -

我有一个清单(1..20) 是否可以将下两个元素作为值分配给键?

我需要修改my %hash = (1..20)才能实现相同目标。

1 -> (2,3) 
4 -> (5,6)
7 -> (8,9)
10 -> (11,12)
13 -> (14,15)

等...

2 个答案:

答案 0 :(得分:2)

use List::MoreUtils 'natatime';

my $it = natatime 3, (1 .. 20);
my %hash;
while (my ($k, @vals) = $it->()) {
  $hash{$k} = \@vals;
}

use Data::Dump;
dd \%hash;

输出

{
  1  => [2, 3],
  4  => [5, 6],
  7  => [8, 9],
  10 => [11, 12],
  13 => [14, 15],
  16 => [17, 18],
  19 => [20],
}

答案 1 :(得分:1)

这是一种仅使用核心Perl工具的方法:

use Data::Dumper;

my @list = ( 1..21 );
my %hash;
while ( @list ) {
    my ($key, @vals) = splice( @list, 0, 3 );
    $hash{$key} = \@vals;
}

print Dumper \%hash;

导致:

$VAR1 = {
          '4' => [
                   5,
                   6
                 ],
          '1' => [
                   2,
                   3
                 ],
          '7' => [
                   8,
                   9
                 ],
          '19' => [
                    20,
                    21
                  ],
          '16' => [
                    17,
                    18
                  ],
          '13' => [
                    14,
                    15
                  ],
          '10' => [
                    11,
                    12
                  ]
        };

然而,它具有破坏原始数组值的缺点。