1

我正在尝试遍历配置文件中的所有值并将数据放入数组中。我只需要将块作为键,然后将设置名称作为值。

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

3 回答 3

4

试试这个:

push @{$settingsTemplate->{$section}}, $parameter;
于 2013-11-07T17:30:46.727 回答
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 };
于 2013-11-07T17:47:39.780 回答
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;

    }
}
于 2013-11-07T17:37:01.017 回答