将数组添加到已经存储数组的哈希条目中

时间:2018-06-19 12:12:18

标签: arrays perl hashtable

我需要评估一系列要转换为数组哈希的字符串。考虑到这种情况,我想将数组添加到已经存储数组的哈希中。我需要获取以下哈希值:

ConfigurationHash{'Editor'} = (John, Mary, Jane, Peter)

我已将代码简化为以下示例:

use strict;
use warnings;

my %ConfigurationHash;

my $String1 = "Editor=John,Mary";
my $String2 = "Editor=Jane,Peter";

my @Line1 = split ("=", $String1);
my @Line2 = split ("=", $String2);

my $Variable1 = @Line1[0];
my $Value1    = @Line1[1];

my $Variable2 = @Line2[0];
my $Value2    = @Line2[1];

my @Values1Array = split(",", $Value1);
my @Values2Array = split(",", $Value2);

if ( ! exists $ConfigurationHash{$Variable1} ) {
    $ConfigurationHash{$Variable1} = @Values1Array;
}
else {
    push (@ConfigurationHash{$Variable1}, @Values1Array);
}

会产生以下错误:

  

现在禁止在./test.pl第25行“ @ Values1Array)”附近进行标量的实验性推送   ./test.pl的执行由于编译错误而中止。

我知道问题出在引用/取消引用,但是我对perl的了解是如此基础,以至于我无法自己弄清楚如何实现。

有人可以告诉我该怎么做吗?如果您能告诉我如何在创建散列后对数组中的值进行迭代,我也将不胜感激。

3 个答案:

答案 0 :(得分:2)

这行没有按照您的想法做。

$ConfigurationHash{$Variable1} = @Values1Array;

如果打印出$ConfigurationHash{$Variable1}包含的内容,则会发现它仅包含@Values1Array的大小。

使用push应该没问题,但对您编写的内容稍作修改。

push @{$ConfigurationHash{$Variable1}}, @Values1Array;

我也删除了括号,因为您不需要它们。

关于遍历数组,与遍历常规数组没有什么不同。由于没有数组,您可能在遍历之前有问题

foreach my $whatever (@{$ConfigurationHash{$Variable1}})
  {
  # Code
  }

答案 1 :(得分:2)

目前尚不清楚为什么您的代码中包含$String2及其派生词,因为它们从未使用过。这段代码处理两个字符串

您只需要{#1}}哈希表中与push(标识符的可怕选择)相对应的数组的值列表。通过解引用数组元素

来实现
$Variable1

输出

use strict;
use warnings;

my %config;

my $s1 = 'Editor=John,Mary';
my $s2 = 'Editor=Jane,Peter';

for ( $s1, $s2 ) {
    my ($key, @values) = split /[=,]/;
    push @{ $config{$key} }, @values;
}

use Data::Dumper;
print Dumper \%config;

答案 2 :(得分:1)

感谢所有发布答案的人。 @Borodin,您是对的,我错过了使用$String2及其派生词的第二个块,但是我认为很明显它在结尾并且类似于我原始代码中的if-else块。 / p>

@ chris-turner,谢谢您给我有关如何正确使用push的提示,并指出了$ConfigurationHash{$Variable1} = @Values1Array;中的错误

通过所有这些贡献,我发现我期望的正确代码是:

use strict;
use warnings;

my %ConfigurationHash;

my $String1 = "Editor=John,Mary";
my $String2 = "Editor=Jane,Peter";

my @Line1 = split ("=", $String1);
my @Line2 = split ("=", $String2);

my $Variable1 = $Line1[0];
my $Value1    = $Line1[1];

my $Variable2 = $Line2[0];
my $Value2    = $Line2[1];

my @Values1Array = split(",", $Value1);
my @Values2Array = split(",", $Value2);

if ( ! exists $ConfigurationHash{$Variable1} ) {
    $ConfigurationHash{$Variable1} = \@Values1Array;
}
else {
    #push (@ConfigurationHash{$Variable1}, @Values1Array);
    push @{$ConfigurationHash{$Variable1}}, @Values1Array;
}

if ( ! exists $ConfigurationHash{$Variable2} ) {
    $ConfigurationHash{$Variable2} = \@Values2Array;
}
else {
    #push (@ConfigurationHash{$Variable2}, @Values2Array);
    push @{$ConfigurationHash{$Variable2}}, @Values2Array;
}

use Data::Dumper;
print Dumper \%ConfigurationHash;

输出以下内容:

$VAR1 = {
          'Editor' => [
                        'John',
                        'Mary',
                        'Jane',
                        'Peter'
                      ]
        };