2012-01-15 6 views
0

これは私の一部(または私のスキルセットよりもはるかに進んだもの)の単純な監視かもしれません。私は、ファイルから入力を読み込んで2次元連想配列を動的に埋めようとしています。Perl動的生成多次元連想配列

my @data; 
while (<FILE>) { 
    chomp; 

    my $ID,$COUNT; 
    print "READ: " . $_ . "\n"; #Debug 1 

    ($ID,$COUNT,undef,undef,undef) = split /\,/; 
    print "DATA: " . $ID . "," . $COUNT . "\n"; # Debug 2 

    $data{$ID}{"count"} = $COUNT; 
    #push @{$data{$ID}{"count"}}, $COUNT; 

       print $data{$ID}{"count"} . "\n"; # Debug 3 
} 

最初の印刷(デバッグ1)は、des313,3 ,,,に似た行を出力します。空白行を印刷するdes313,3

第三のプリント(デバッグ3):

第二の印刷(デバッグ2)ラインデータを印刷します。

問題は、データを結合配列に挿入しようとしているようです。私は直接挿入とプッシュメソッドの両方を試してみましたが結果はありません。私はPHPでこれを行ったが、私はPerlでこれを見落としていると思う。私はハッシュのハッシュのセクションでperldoc perldscのページを見ましたが、私はそれがそれらの動的な生成について話しているのを見ませんでした。どんな提案も素晴らしいだろう!

+0

それは、そのままあなたのコードは私のために正常に動作改善することができるが。 3番目のデバッグ行は、$ COUNTの格納された値を正しく出力します。このコードをもう一度チェックして、どのような結果が得られたのか、使用しているデータファイルの内容を教えてください。 – Borodin

+0

「連想配列」という言葉を使っているソースからPerlを学んでいるなら、それはほぼ間違いなく時代遅れです。 15歳以上でないものを探してください。 –

答えて

5

ハッシュに割り当てることは、うまくいくはずです。変数を不適切に宣言しています。あなたの連想配列はPerlでハッシュと呼ばれ、接頭辞は% sigilなので、whileループの前にはmy %dataと書くべきです。ループ内では、myオペレーターはリストに適用するには括弧を必要とします。したがって、my ($ID, $COUNT);である必要があります。

この最小限の例では、正常に動作します。

use warnings; # place these lines at the top of all of your programs 
use strict; # they will catch many errors for you 

my %data; # hash variable 
while (<DATA>) { 
    chomp; 
    my ($id, $count) = split /,/; # simplify the split 

    $data{$id}{count} = $count; # build your hash 
} 

print "got: $data{des313}{count}\n"; # prints "got: 3" 

__DATA__ 
des313,3 
+0

解決策を取ることはうまくいきます。しかし、自分のコードに変更を加えると、いくつかの問題を修正した後でさえも変わりません。 – jinanwow

+0

何が起こっていたのかをトラブルシューティングした後。私のprintステートメントはprint $ data {$ ID} {count}でした。 "\ n"(\ nの前の余分なスペース)。私は余分なスペースを取り除き、私が望む結果を得ました。余分なスペースがどのように出力されないのか正確にはわかりませんが、今は動作します。ありがとう! – jinanwow