将哈希的内容复制到另一个更大的哈希中

时间:2016-08-24 22:14:07

标签: arrays perl hash associative

我正在为一个包含未知数量的各种对象的配置文件的配置解析器工作,所有这些对象都有自己的字段/值对。

配置文件如下所示:

ObjectType1
  name Alpha
  host 127.0.0.1
ObjectType1
  name Beta
  host 10.11.12.13
ObjectType2
  name AlphaPolicy
  type This
  useExtraWidgets true

所以我试图将每个单独的对象解析为字段/值的哈希,这非常有用。让我沮丧的是,我希望将每个单独的对象添加到一个包含整个配置的更大哈希中。这个较大的哈希应该为每个对象类型都有一个数组,它包含一个特定对象的字段/值。我只是无法弄清楚如何以合理的方式将字段/值的哈希值推送到更大的哈希值上。

这里有一些带注释的伪代码 - 有人可以帮助我在哪里需要@ s,$ s,括号等吗?我称之为伪代码,因为它实际上并不起作用。它什么都不打印。感谢。

my %hash1,%hash2;

$hash2{'name'} = "Alpha";
$hash2{'host'} = "127.0.0.1";
push @{$hash1{'ObjectType1'}}, %hash2;

undef %hash2;

$hash2{'name'} = "Beta";
$hash2{'host'} = "10.11.12.13";
push @{$hash1{'ObjectType1'}}, %hash2;

undef %hash2;

$hash2{'name'} = "AlphaPolicy";
$hash2{'type'} = "this";
$hash2{'useExtraWidgets'} = "true";
push @{$hash1{'ObjectType2'}}, %hash2;

print $hash1{'ObjectType1'}[0]{'name'}; #I want this to print "Alpha"
print $hash1{'ObjectType1'}[1]{'host'}; #I want this to print "10.11.12.13"
print $hash1{'ObjectType2'}[0]{'name'}; #I want this to print "AlphaPolicy"

1 个答案:

答案 0 :(得分:0)

当您在Perl中嵌套数据结构时,您需要存储对结构的引用而不是结构本身。您可以通过转义符号来引用Perl中的变量,例如:

my (%hash1, %hash2);

$hash2{'name'} = "Alpha";
$hash2{'host'} = "127.0.0.1";
push @{$hash1{'ObjectType1'}}, \%hash2; # n.b. the \

当您稍后尝试访问这些值时,您必须使用箭头中缀运算符(->)取消引用它们:

say $hash1{ObjectType1}->[0]->{name};

换句话说,取消引用存储在$hash1{ObjectType1}的数组并取第一个元素;取消引用存储在该元素中的哈希并获取name密钥。现代Perls让你崩溃甚至省略(在某些情况下,我认为只要“头”本身不是一个参考)箭头中缀运算符,所以根据你的版本,这应该工作:

say $hash1{ObjectType1}->[0]{name};

甚至可能这样:

say $hash1{ObjectType1}[0]{name};

我强烈建议您在有时间的情况下阅读perlref [tut],perllolperldsc