2016-08-24 72 views
0

我正在为配置文件工作,该配置文件包含未知数量的各种对象,并且都有其自己的字段/值对。将哈希的内容复制到另一个更大的哈希

配置文件看起来是这样的:

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" 
+0

请注意,您应该为变量创建比'%hash1'和'%hash2'更好的名称。 – Borodin

+0

哦,是的,绝对。这只是我整理的一个仿真测试案例。 – largesock

+0

您在这里编写的用于世界消费的样本“人工”代码具有非常差的标识符,而最终的代码只能由您自己和其他人阅读(可能会)具有“正确”名称。 – Borodin

回答

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密钥。现代皮尔斯让你崩溃,甚至忽略(在某些情况下,我觉得只要“头”是不是本身的引用)箭头缀运营商,所以根据您的版本,这应该工作:

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

甚至可能是这样的:

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

我会强烈建议阅读perlref [tut],perllol,并且perldsc当你有一段时间了!

+0

*“当您稍后尝试访问这些值时,必须使用箭头中缀运算符对它们进行解引用”*这不是必需的。关闭和打开花括号或方括号之间的箭头是可选的,并且OP所要求的语法将可以正常工作。 – Borodin

+0

谢谢 - 我上一次在大学里大约15年前真正学习过Perl,现在只是将它用于小脚本。它主要是知识的功能级别,但当我必须使用指针,箭头操作符等时,它会变得很渺茫。这大大澄清了事情,我也非常欣赏可供进一步阅读的链接。 – largesock