2012-01-15 28 views
0

這可能是我的一個簡單的忽略(或比我的技能更先進的東西)。我試圖通過從文件中讀取輸入來動態填充2d關聯數組。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 ,,,的行。

第二打印(調試2)將打印線DATA:des313,3

第三打印(調試3)將打印一個空行。

這個問題似乎是我試圖將數據插入關聯數組的方式。我已經嘗試了直接插入和推式方法,但沒有結果。我已經用PHP做了這個,但我認爲我在Perl中忽略了這一點。我在HASHES的HASHES部分查看了perldoc perldsc頁面,但是我沒有看到它談論它們的動態生成。任何建議都會很棒!

+0

儘管可以提高你的代碼工作正常,我因爲它的立場。第三個調試行正確打印存儲的$ COUNT值。請再次檢查此代碼,並告訴我們您會得到什麼結果以及您正在使用的數據文件的內容。 – Borodin 2012-01-15 04:40:44

+0

如果您從使用術語「關聯數組」的源學習Perl,那麼它幾乎肯定是過時的。請找一些不超過15歲的東西。 – 2012-01-15 16:29:21

回答

5

指定散列的方式你應該工作得很好。你正在宣佈你的變量不當。您的關聯數組在Perl中稱爲哈希,並且前綴爲%印記,所以您應該在while循環之前寫入my %data。在循環中,my運營商需要parens才能應用於列表,因此它應該是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 2012-01-15 04:40:50

+0

在做了一些故障排除後發現發生了什麼事。我的打印語句有打印$ data {$ ID} {count}。 「\ n」(\ n之前的額外空格)。我刪除了額外的空間,我得到了我想要的結果。不確定額外的空間究竟是如何導致沒有輸出,但現在它工作。謝謝! – jinanwow 2012-01-15 04:41:19