2017-06-13 21 views
1

我有幾個包含產品安裝信息的文件。 我能夠從文件中grep我想要的元素(例如,「版本」)。而我最終是這樣的:動態生成數組和子數組(perl)

instancefile1:ABC_version=1.2.3 
instancefile1:XYZ_version=2.5 
instancefile2:ABC_version=3.4.5 
instancefile3:XYZ_version=1.1 

凡組件的命名ABC或XYZ。

我想要做的是採取這個grep輸出並通過perl解析它以在文件上構建數組。 第一個數組將由實例編號(從文件名中拉出)組成 - 上面,我將有一個數組,它將以1,2,3作爲元素。

而在這些數組中,每個數組都將是該特定實例所具有的組件。

全部預期陣列和部件從上方:

陣列[0] =#instancefile1可以保持這個命名像的文件名, 或分配名稱。不要緊

array[0][0] = ABC_version=1.2.3 
array[0][1] = XYZ_version=2.5 

陣列[1] = instancefile2

array[1][0] = ABC_version=3.4.5 

數組[2] = instancefile3

array[2][0] = XYZ_version=1.1 

(我知道我的符號來引用子數組是不正確的 - 我在我的perl上生鏽了。)

我該怎麼做? (我一直在用bash數組和grep來做,然後通過初始的grep輸出和我的第一個數組重複,然後用另一個grep來填充另一個數組 - 但是這好像是它不止一次地處理數據,而不是在飛行中構建它。)

這個想法是讓它按照它看到的構建每個數組。它看到「fileinstance1」,它將值存儲在該數組中的右側,因爲它看到它。然後,如果它看到「fileinstance2」,它將創建該數組並使用這些值進行填充,所有操作都將在一次完成。我相信perl是最好的工具嗎?

回答

1

除非可以保證具有相同密鑰的記錄彼此相鄰,否則以HoA開始更容易。

my %data; 
while (<>) { 
    chomp; 
    my ($key, $val) = split /:/; 
    push @{ $data{$key} }, $val; 
} 

然後轉換爲農產品協議:

my @data = values(%data); 

保序:

my %data; 
my @data; 
while (<>) { 
    chomp; 
    my ($key, $val) = split /:/; 
    push @data, $data{$key} = [] 
     if !$data{$key}; 

    push @{ $data{$key} }, $val; 
}