2013-11-07 7 views
1

Я пытаюсь перебрать все значения в моем файле конфигурации и поместить данные в массив. Мне просто нужно получить блок как ключ, а затем имя параметра в качестве значения.Perl Loop add to Hash

#Config File looks like this 

[Actions] 
action=0 
actionCR=1 
actionHighlight=1 

[Hotkeys] 
key=38 
keyCR=32 
keyHighlight=39 

[Settings] 
chbAcronym=1 
chbCompleted=0 

# End Config 




my %settingsTemplate; 
my $settingsTemplate; 

# Loop over each section in the template 
foreach my $section (keys %{$cfg}) { 

    # Loop over all the setting titles 
    foreach my $parameter (keys %{$cfg->{$section}}) { 

     # Push setting titles to an array 
     $settingsTemplate->{$section} = $parameter; 

    } 
} 

print Dumper($settingsTemplate); 

$VAR1 = { 
     'Hotkeys' => 'key', 
     'Actions' => 'actionCR', 
     'Settings' => 'chbAcronym' 
    }; 

Вот как он печатает массив, который не является тем, что мне нужно. .

Это желаемый результат (не уверен, что мое форматирование правильно, но, надеюсь, вы можете понять это

$VAR1 = { 
     'Hotkeys', 
      => 'key', 
      => 'keyCR', 
      => 'keyHighlight', 
     'Actions', 
      => 'action', 
      => 'actionCR', 
      => 'actionHighlight', 
     'Settings', 
      => 'chbAcronym', 
      => 'chbCompleted' 
    }; 
+0

Почему бы не использовать JSON, YAML или http://search.cpan.org/~drtech/Config-Merge-1.01/lib /Config/Merge.pm –

ответ

1

Как и было предложено, используйте хэш массивов и нажмите.

Обратите внимание: вы не получите ключи в том порядке, в каком они были в файле; Я бы рекомендовал изменения:

foreach my $parameter (keys %{$cfg->{$section}}) { 

в

foreach my $parameter (sort keys %{$cfg->{$section}}) { 

поэтому они имеют последовательный порядок, а не тот, который изменяется.

Хотя внутренняя петля на самом деле не нужна; вы можете просто сделать:

# Loop over each section in the template 
foreach my $section (keys %{$cfg}) { 
    # Put setting titles into an array 
    $settingsTemplate->{$section} = [ sort keys %{$cfg->{$section}} ]; 
} 

или еще более лаконично:

my $settingsTemplate = { map { $_, [ sort keys %{$cfg->{$_}} ] } keys %$cfg }; 
3

попробовать это:

push @{$settingsTemplate->{$section}}, $parameter; 
+0

Это отлично поработало, спасибо большое! – SBB

0

Ваш код выполняет задание вместо толчка Хэши в Perl имеют только одно значение по умолчанию. Вы хотите получить хэш массивов.

http://perldoc.perl.org/perldsc.html#HASHES-OF-ARRAYS

# Loop over each section in the template 
foreach my $section (keys %{$cfg}) { 

    # Loop over all the setting titles 
    foreach my $parameter (keys %{$cfg->{$section}}) { 

     # Push setting titles to an array 
     push @{$settingsTemplate->{$section}}, $parameter; 

    } 
}