別の

2011-07-12 1 views
0

説明別の

一つアレイはキーのセットを保持しています。これらのキーの値は内部ハッシュです。これらの内側ハッシュのキーは、この場合配列番号のような数字です。別の配列は内部ハッシュの値を保持します。

質問:

どのようにあなたが正しい対応する値(すなわち正しい内部ハッシュ)と外側のハッシュキーを読み込むことができますか?

Contraints

私はスライス、マップやgrepを利用し解決策を好むだろう。ループのカスケードを排除する

私はそれがHoAでなければならないことを認識しています。しかし、これは私が学ぶことだけのためである、それは機能的価値を持っていない...

ワーキングコード

私が望むように、このコードは動作しますが、私は、より高度なテクニックを使用したいと思います:

#! usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 

my %register=(); 

my @classNames = ('Science_class', 'Math_class'); 
my @Science_class_student_names = ('George', 'Lisa', 'Mathias'); #prob from file 
my @Math_class_student_names = ('Martin', 'Anna', 'Peter', 'George'); #prob from file 

foreach my $className (@classNames) { 
    my $array_name = $className.'_'.'student_names'; 
    if ($array_name =~ /Science/) { 
     foreach (0..$#Science_class_student_names) { 
      $register{$className}{$_ + 1} = $Science_class_student_names[$_]; 
     } 
    } 
    elsif ($array_name =~ /Math/) { 
     foreach (0..$#Math_class_student_names) { 
      $register{$className}{$_ + 1} = $Math_class_student_names[$_]; 
     } 
    } 
} 

print Dumper(\%register); 

アイデア

ハッシュスライスは、ダイレクトキー値pのために働きますしかし、中間の鍵は私を捨てている。 @register{@classNames} = map{$count => $student}

if文の前には、配列名に文字列を使用する方法があるかどうかという考えがありましたが、それは機能しません。

もう一つは、すべての内側ハッシュキーの配列を別々に作成し、スライスを使用して、そのハッシュを外側のハッシュに配置することです。

私が持っていた唯一のアイデアは、すべての '内部ハッシュ値'配列を保持するためにAoAを使用していたということです。 (すなわち。my @studentNames = (\@Science_class_student_names, \@Math_class_student_names);が、まだそれをどこにももらっていない。

答えて

4

それは。一度それに層を動作するように簡単です内側の層のために、あなたが

1 => George, 
2 => Lisa, 
... 

だから把握することから始めたいと思われますあなたGE場合はそれをする。

map { $_+1 => $Science_class_student_names[$_] } 
    0..$#Science_class_student_names 

ですから、

$register{'Science_class'} = { 
    map { $_+1 => $Science_class_student_names[$_] } 
     0..$#Science_class_student_names 
    } 
}; 

$register{'Math_class'} = { 
    map { $_+1 => $Math_class_student_names[$_] } 
     0..$#Math_class_student_names 
    } 
}; 

で終わる方法を内層をネラル化すると、

for (
    [ 'Science_class' => \@Science_class_student_names ], 
    [ 'Math_class' => \@Math_class_student_names ], 
) { 
    my ($class_name, $student_names) = @$_; 
    $register{$class_name} = { 
     map { $_+1 => $student_names->[$_] } 
     0..$#$student_names 
    }; 
} 
+0

優れた答え、思考のプロセスを与えてくれてありがとう。私の1つの質問です:それぞれの 'クラス'(これは私がif-elseを使用していた)に対して '' Science_class '=> \ @ Science_class_student_names'とタイプするのではなく、外部レイヤーを一般化できますか?それは可能ではないようです。 – Jon

+0

すごい!注:( '@ studentNames'は、AoAのアイデアのセクションにあるように)同じクラスを使用しています。質問)。次に、forループを次のように置き換えます。 'for(keys%classhash){'と宣言を置き換えます。 'my $ class_name = $ _; my $ student_names = $ classhash {$ _}; ' – Jon