Perl Loop添加到Hash

时间:2013-11-07 17:25:57

标签: perl 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'
    };

3 个答案:

答案 0 :(得分:4)

试试这个:

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

答案 1 :(得分:1)

根据建议,使用数组哈希并推送。

请注意,您不会按照文件中的顺序获取密钥;我建议改变:

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

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

所以他们有一致的顺序,而不是一个变化的顺序。

虽然实际上不需要内部for循环;你可以这样做:

# 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 };

答案 2 :(得分: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;

    }
}