我搜索了如何做到这一点,在谷歌和stackoverflow,我现在在一个点,我相当卡住,无法做到这一点这个。在嵌套散列中查找键然后创建所有键的树
我有一个称为BigHash作为输入哈希繁重嵌套散列,我有一个变更列表,这也是哈希有一些键和值。
我想在BigHash中查找更改列表中的每个键,并检查值是否匹配,如果不匹配,则尝试创建该键的所有祖先的列表作为字符串用;
分开。
这是我的更改列表和预期输出。
这是我的改变列表:
my $changelist = {
'ReqPending' => '9',
'DopplerEnable' => 'true',
'BSColorCode' => '7'
}
这是我期望的输出:
(注输出字符串中以逗号分隔的数组中的字符串中的每个元素是实际的祖先。在与变更表该密钥的值链接变更列表关键的树)
@Output = "Ctrl;SuperCel;Timers;ReqPending=9", "Phy;CELL;SystemCommon;Config;DopplerEnable=true", "Phy;CELL;SystemCommon;PhysicalCell;BSColorCode=7"
这是我的大哈希:
(散列是通过将一个XML文件转换成一个散列得到的,它嵌套数组和哈希)
my $Bighash= {
'Ctrl' => [
{
'SuperCel' => [
{
'Config' => [
{
'Retry' => '3',
'Context' => '3'
}
],
'Timers' => [
{
'ReqPending' => '2',
'RelocationReqPending' => '2'
}
]
}
]
}
],
'xmlns' => 'http://www.somewebsite.com/oam',
'Phy' => [
{
'CELL' => [
{
'SystemCommon' => [
{
'Config' => [
{
'SrsOn' => 'true',
'WindowLength' => '2',
'DopplerEnable' => 'false',
'WindowSize' => '3',
}
],
'PhysicalCellID' => '0',
'ColorConfig' => [
{
'AckNackFeedback' => '1',
'frameAssignment' => '1',
'SframePattern' => '7'
}
],
'Ports' => '2',
'AntennaCount' => '2',
'NumberOfConnections' => '8',
'PhysicalCell' => [
{
'NwColorCode' => '0',
'BSColorCode' => '0'
}
],
'CellIdentity' => '0',
'IdentityGroup' => '0',
'OverrideEnableFlag' => 'false'
}
],
'Dedicated' => [
{
'SoundingRs' => [
{
'ConfigDedicatedRel10' => [
{
'Format' => [
{
'DomainPosition' => '0',
'TransmissionComb' => '0',
'Shift' => '1',
'Port' => '1',
'Bandwidth' => '0'
}
],
}
]
}
],
'Numerology' => [
{
'profileNumber' => '0'
}
]
}
]
}
]
}
]
}
你能帮助我吗?
我已经写了类似这样的东西,但它不正确,我没有得到它。
sub recursive {
$hash = shift;
foreach my $key1 (keys %$hash) {
if (ref($hash->{$key1}) eq "HASH") {
if ($var ne "") {
$var = join(";", $var, $key1);
}
else {
$var = $key1;
}
recursive($hash->{$key1});
}
elsif (ref($hash->{$key1}) eq "ARRAY") {
$tem = @{ $hash->{$key1} };
if ($var ne "") {
$var = join(";", $var, $key1);
}
else {
$var = $key1;
}
foreach $item (@{ $hash->{$key1} }) {
if (ref($item) eq "HASH") {
#$var = join (";",$var,$key1);
recursive($item);
}
else {
}
}
}
else {
if ($var ne "") {
$temp = $var;
$var = join(";", $var, $key1);
print $var. "\n";
#$var=$temp;
}
else {
$var = $key1;
undef($var);
}
}
}
}
recursive($BigHash);
在'$ Bighash',为什么每个哈希裁判嵌入数组引用?这是否与生成bighash有关?原来是XML还是其他一些格式,并且您使用了像XML :: Simple这样的模块来获得这种结构,而您实际上是在尝试编辑XML?你确定这是所有相关信息,并且这不是[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Miller
是的,我通过将XML文件转换为哈希来得到这个'$ BigHash',这就是为什么它是这样的: – YouHaveaBigEgo
你最终的目标是用这些更新的值来编辑XML文件本身吗?注意[:XML: :Simple'](https://metacpan.org/pod/XML::Simple)已经过时了,不过它确实有更好的输出选项,但最好的选择是使用一个模块,如[XML :: Twig '](https://metacpan.org/pod/XML::Twig)或['XML :: LibXML'](https://metacpan.org/pod/XML::LibXML)。如果你分享了你的实际数据和我们的目标,你可能会得到更好的建议。 – Miller