2017-06-13 7 views
1

製品インストール情報を含む複数のファイルがあります。 私は、ファイルから必要な要素(たとえば、 "version")をgrepすることができます。コンポーネントはABCまたはXYZ名前が付けられてい動的に配列とサブアレイを生成する(perl)

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

:そして、私はこのようなものになってしまいます。

私がしたいのは、このgrepの出力を受け取り、それをperlで解析してファイルに配列を作成することです。 最初の配列はインスタンス番号(ファイル名から引っ張られたもの)で構成されています - 上記の場合、1,2,3を要素とする配列があります。

これらの配列のそれぞれの内部には、その特定のインスタンスが持つコンポーネントがあります。上記から

フル予想配列と成分:

配列[0] = instancefile1#、ファイル名のような名前にこれを維持 または名前を割り当てることができます。 [1] = instancefile2

array[1][0] = ABC_version=3.4.5 

配列[2] = instancefile3

array[2][0] = XYZ_version=1.1 

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

配列を問題ではありません(私はサブアレイを参照するための私の表記が正しくないことを知っています - 私は私のperlで錆びている。)

どうすればよいですか? (私はちょうどbashの配列とgrepでやっていて、最初の配列で最初のgrep出力を繰り返し、もう1つの配列を埋めるために別のgrepをやり直していますが、これはデータを複数回通過しているようですが、その場で構築するのではなく)。

考えられるのは、各アレイを見ているように構築することです。それは "fileinstance1"を見て、それはそれが見ているように、その配列の右側に値を格納します。次に、 "fileinstance2"が見つかると、その配列を作成し、それらの値を1回のパスで入力します。私はperlがこれに最適なツールだと信じていますか?

答えて

1

同じキーを持つレコードが互いに隣り合っていることが保証されていない限り、HoAから始める方が簡単です。

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

その後AoAのに変換:

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; 
} 
関連する問題