我需要评估一系列要转换为数组哈希的字符串。考虑到这种情况,我想将数组添加到已经存储数组的哈希中。我需要获取以下哈希值:
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的了解是如此基础,以至于我无法自己弄清楚如何实现。
有人可以告诉我该怎么做吗?如果您能告诉我如何在创建散列后对数组中的值进行迭代,我也将不胜感激。
答案 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'
]
};