Ich versuche Array von Hash-Referenz zu erzeugen, erstellt durch Zusammenfügen aller Schlüssel von Hashes mit Sortierung. Betrachten I dynamische Hashreferenz haben wieErzeuge Array von Referenz-Hash
my $hash_ref = {
'A1' => {
'B2' => {
'C1' => {
'D1' => {},
'D2' => {},
'D3' => {}
}
},
'B3' => {
'C1' => {
'D2' => {},
'D1' => {},
'D3' => {}
}
},
'B1' => {
'C1' => {
'D1' => {},
'D2' => {}
}
}
}
};
wie Array aus wie
@arr = qw/A1B1C1D1 A1B1C1D2 A1B2C1D1 ..../;
unten oben Hash zu erzeugen, ist der Code I versucht (die nicht funktioniert)
my $out = hash_walk($hash_ref);
say Dumper $out;
sub hash_walk {
my $hash = shift;
my $array_ref;
my $temp_arr;
my @temp_arr2;
foreach my $k (sort keys %$hash) {
$v = $$hash{$k};
if (ref($v) eq 'HASH') {
# Recurse.
$temp_arr = hash_walk($v);
}
push @$array_ref, $k if $k;
my (@lvlfirst, @lvlnext);
if ($array_ref && $temp_arr){
@lvlfirst = @$array_ref;
@lvlnext = @$temp_arr;
}
for (my $i = 0 ; $i <= $#lvlfirst ; $i++) {
for (my $j = 0 ; $j <= $#lvlnext ; $j++) {
push @temp_arr2, "$lvlfirst[$i]$lvlnext[$j]"; ##Trying to join here
}
}
}
return \@temp_arr2;
}
XML ist:
<root>
<class1 name="A1">
<class2 name="B1">
<class3 name="C1">
<class4 name="D1"></class4>
<class4 name="D2"></class4>
</class3>
</class2>
<class2 name="B2">
<class3 name="C1">
<class4 name="D1"></class4>
</class3>
</class2>
<class2 name="B3">
<class3 name="C1">
<class4 name="D1"></class4>
<class4 name="D2"></class4>
<class4 name="D3"></class4>
</class3>
</class2>
</class1>
</root>
Das klingt wie ein XY-Problem. Könnten Sie das etwas näher erläutern? Normalerweise rekursive Strukturen sind aus einem Grund rekursiv. – Sobrique
@Sobrique Die Eingabehashref wird aus einer Klassifizierungshierarchie von Daten in XML generiert. Ich muss Daten verbinden, um Zeichenketten zu erzeugen, die Elternkindunterseite darstellen. – waghso
Ok. Kann ich vorschlagen, einen Schritt zurück zu machen? Verwenden Sie einen XML-Parser - posten Sie Ihren XML-Code, und wir können Ihnen leichter geben, was Sie wollen, wenn XML-Parser diese Rekursion implizit verarbeiten. – Sobrique