创建一个哈希,其中键是一个数组,值是一个数组数组

时间:2013-05-22 12:52:36

标签: arrays perl hash multidimensional-array

我正在尝试创建一个哈希,其中键包含在数组中,值包含在数组的数组中:

my @keys = (1,2,3,4,5);
my @value1 = (a,b,c,d,e);
my @value2 = (f,g,h,i,j);
my @value3 = (k,l,m,n,o);

my @values = ([@value1],[@value2],[@value3]);

my %hash;

我想创建一个哈希,其中@keys为键,@ value为值,因此键'1'将返回值a,f,k(每个数组中的第0个元素),依此类推。

对于单个密钥,这将实现如下:

%hash=('key'=>@values);

但我不确定如何为一组键修改它。

任何帮助都会很棒!

干杯,

<磷>氮

5 个答案:

答案 0 :(得分:4)

这样的事情:

my %hash = map { $keys[$_] => [ $value1[$_], $value2[$_], $value3[$_] ] } 0..$#keys;

假设所有四个列表都具有相同的长度。

答案 1 :(得分:2)

试试这个......

#! /usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @keys = qw( undef 0 1 $key kappa );
my @value1 = qw(a b c d e);
my @value2 = qw(f g h i j);
my @value3 = qw(k l m n o);

# not used here...
# my @values = ([@value1],[@value2],[@value3]);

my %hash = map { my $key = "$keys[$_]"; $key => [ $value1[$_], $value2[$_], $value3[$_] ] } (0..$#keys);

for my $key ( sort keys %hash ) {
    print "Key: $key contains: ";
    for my $value ( @{$hash{$key}} ) {
        print "$value ";
    }
    print "\n";
}

print "Should print 'c': ".@{$hash{'1'}}[0]."\n";
print "Should print 'j': ".@{$hash{'kappa'}}[1]."\n";

# print Dumper( %hash );

预期输出如下:

Key: $key contains: d i n 
Key: 0 contains: b g l 
Key: 1 contains: c h m 
Key: kappa contains: e j o 
Key: undef contains: a f k 
Should print 'c': c
Should print 'j': j

添加:如果您想要访问哈希中的单个值,它应该被@ {}包围以转换匿名数组引用,然后以方括号中的索引(从零开始)结束,如[0]。例子:

print "Should print 'c': ".@{$hash{'1'}}[0]."\n";
print "Should print 'j': ".@{$hash{'kappa'}}[1]."\n";

修改为包括Ekkehard更正确使用(0 .. $#..)并添加一些防弹键。

答案 2 :(得分:2)

我利用语法$foo[$i][$j];将数组数组表示为二维数组。这是一个没有map的答案:

#! /usr/bin/env perl

use 5.12.0;
use warnings;
use Data::Dumper;

my @keys = qw(alpha beta gamma delta epsolon);

my @values1 = qw(one two three four five);
my @values2 = qw(uno dos tres quatro cinco);
my @values3 = qw(a b c d e);

my @values = ( \@values1, \@values2, \@values3 );

my %hash;
for my $item ( (0..$#keys) ) {
    my @array;
    push @array, $values[0][$item], $values[1][$item], $values[2][$item];
    $hash{$keys[$item]} = \@array;
}

say Dumper \%hash;

这是输出:

$VAR1 = {
      'gamma' => [
           'three',
           'tres',
           'c'
         ],
      'delta' => [
           'four',
           'quatro',
           'd'
         ],
      'alpha' => [
           'one',
           'uno',
           'a'
         ],
      'beta' => [
          'two',
          'dos',
          'b'
        ],
      'epsolon' => [
             'five',
             'cinco',
             'e'
           ]
    };

看起来正确。当然,我从未验证过各种阵列的大小都是一样的。

答案 3 :(得分:1)

结合Vedran和Jim的最佳解决方案:

use strict;
use warnings;

# my @keys   = ( 1,  2,  3,  4,  5);
my @keys   = ( 'alpha','beta','gamma','delta','epsilon');
my @value1 = ('a','b','c','d','e');
my @value2 = ('f','g','h','i','j');
my @value3 = ('k','l','m','n','o');

my %hash = map { $keys[$_] => [ $value1[$_], $value2[$_], $value3[$_] ] } (0 .. $#keys);
printf 'first (%s) value: [%s]', $keys[0], join ", ", @{$hash{$keys[0]}};

输出:

first (alpha) value: [a, f, k]

或:

first (1) value: [a, f, k]

取决于您选择的@keys。

答案 4 :(得分:0)

use Algorithm::Loops 'MapCarE';
my @keys = qw(1 2 3 4 5);
my @value1 = qw(a b c d e);
my @value2 = qw(f g h i j);
my @value3 = qw(k l m n o);

my %hash = MapCarE { $_[0] => [ @_[1..$#_] ] } \(@keys, @value1, @value2, @value3);

MapCarE循环遍历数组,首先调用您提供的代码,然后传递数组的第一个元素,然后是秒元素等。