4

キーが配列に含まれ、値が配列の配列に含まれるハッシュを作成しようとしています:

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;

キー '1' が値 a、f、k (各配列の 0 番目の要素) などを返すように、@keys をキーとして、@values を値としてハッシュを作成したいと考えています。

単一のキーの場合、これは次のように達成されます。

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

しかし、キーの配列に対してこれを変更する方法がわかりません。

どんな助けでも素晴らしいでしょう!

乾杯、

N

4

5 に答える 5

4

このようなもの:

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

4 つのリストすべてが同じ長さであると仮定します。

于 2013-05-22T12:57:08.613 に答える
2

これを試して...

#! /usr/bin/perl
厳密に使用します。
警告を使用します。
Data::Dumper を使用します。

私の @keys = qw( undef 0 1 $key kappa );
私の @value1 = qw(abcde);
私の @value2 = qw(fghij);
私の @value3 = qw(klmno);

# ここでは使用しません...
# my @values = ([@value1],[@value2],[@value3]);

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

私の $key (ソートキー %hash ) {
    print "キー: $key contains: ";
    私の $value ( @{$hash{$key}} ) {
        print "$値";
    }
    "\n" を印刷します。
}

print "'c' を出力する必要があります: ".@{$hash{'1'}}[0]."\n";
print "'j' を出力する必要があります: ".@{$hash{'kappa'}}[1]."\n";

# print Dumper( %hash );

次のような予想される出力を使用します。

キー: $key 内容: din
キー: 0 内容: bgl
キー: 1 内容: chm
キー: kappa 内容: ejo
キー: undef 内容: afk
「c」を出力する必要があります: c
「j」を出力する必要があります: j

追加: ハッシュ内の単一の値にアクセスする場合は、匿名配列参照を変換するために @{} で囲み、[0] のように角かっこでインデックス (ゼロから開始) で終了する必要があります。 . 例:

print "'c' を出力する必要があります: ".@{$hash{'1'}}[0]."\n";
print "'j' を出力する必要があります: ".@{$hash{'kappa'}}[1]."\n";

Ekkehard の (0..$#..) のより適切な使用法を含めるように変更し、キーの防弾処理を追加しました。

于 2013-05-22T13:38:45.177 に答える
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 によって異なります。

于 2013-05-22T13:46:46.450 に答える