创建一个散列,其中键是一个数组,值是数组的数组



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

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为键、@values为值的哈希,这样键"1"就会返回值a、f、k(每个数组中的第0个元素(等等

对于单个密钥,这将通过以下方式实现:

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

但我不确定如何对一组键进行修改。

任何帮助都将是惊人的!

干杯,

N

类似这样的东西:

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

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

我利用语法$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'
           ]
    };

看起来不错。当然,我从未验证过各种阵列的大小是否都相同。

试试这个。。。

#/usr/bin/perl严格使用;使用警告;使用数据::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(;#此处未使用。。。#my@values=([@value1],[@value2],[@value3](;my%hash=map{my$key="$keys[$_]";$key=>[$value1[$_]$value2[$_]]$value3[$_]]}(0..$#keys(;对于我的$key(排序键%hash({print"密钥:$Key包含:";对于我的$value(@{$hash{$key}}({打印"$value";}打印"\n";}print"应该打印'c':"@{$hash{'1'}}[0]。"\n";print"应该打印'j':"@{$hash{'kappa}}[1]。"\n";#打印转储程序(%hash(;

预期输出如下:

密钥:$Key包含:d i n密钥:0包含:b g l密钥:1包含:c h m密钥:kappa包含:e j o密钥:undef包含:a f k应打印"c":c应打印"j":j

添加:如果您想访问哈希中的单个值,则应将其用@{}括起来以转换匿名数组引用,然后以方括号中的索引(从零开始(结束,如[0]。示例:

print"应该打印'c':"@{$hash{'1'}}[0]。"\n";print"应该打印'j':"@{$hash{'kappa}}[1]。"\n";

修改为包括Ekkehard更正确地使用(0..$#..(,并添加了一些防弹钥匙。

结合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]

取决于您选择的@键。

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在数组中循环,调用您提供的代码,首先传递数组的第一个元素,然后传递seconds元素等。

相关内容

  • 没有找到相关文章

最新更新