Hashreferenz nach Anzahl Array Elemente
Slaughter
- perl
Hallo zusammen,
ich habe folgendes Problem.
Ich muss ein Hashreferenz aufbauen, die sich wie folgt zusammensetzt:
In einer existierenden Hashreferenz ($d) befinden sich ein Pfaddefinition(PATH) und ein Name(NAME) des niedrigsten Ordners.
Daraus möchte ich nun die folgende Hashreferenz aufbauen, jedoch mit beliebig tiefer Ordnerstruktur. Im Beispiel habe ich nur vier Ebenen dargestellt, der verwendete Ablauf müsste in einer Schleife durchgeführt werden, leider habe ich keinen Plan, wie das fuunktionieren soll. Ich hoffe Ihr könnt mir helfen.
Gruß
Slaughter
Beispiel:
my $d=undef;
$d->{1}->{PATH}="100";
$d->{1}->{NAME}="Hundert";
$d->{2}->{PATH}="100/101";
$d->{2}->{NAME}="Hunderteins";
$d->{3}->{PATH}="100/101/102";
$d->{3}->{NAME}="Hundertzwei";
$d->{4}->{PATH}="100/101/102/103";
$d->{4}->{NAME}="Hundertdrei";
my $id="PATH";
my $name="NAME";
my $tree=undef;
foreach my $l (sort {$a<=>$b} keys(%$d)){
#Teilen des Pfades, jede Nummder ein Array Element
my @k=split("/",$d->{$l}->{$id});
#Sofern sich nur ein Element in dem Array befindet => oberste Pfad Ebene
$tree->{$k[0]}->{$id}=$d->{$l}->{$id} if ( @k == 1 );
$tree->{$k[0]}->{$name}=$d->{$l}->{$name} if ( @k == 1 );
#Sofern sich zwei Elemente in dem Array befindet => zweite Pfad Ebene
$tree->{$k[0]}->{$k[1]}->{$id}=$d->{$l}->{$id} if ( @k == 2 );
$tree->{$k[0]}->{$k[1]}->{$name}=$d->{$l}->{$name} if ( @k == 2 );
#Sofern sich drei Elemente in dem Array befindet => dritte Pfad Ebene
$tree->{$k[0]}->{$k[1]}->{$k[2]}->{$id}=$d->{$l}->{$id} if ( @k == 3 );
$tree->{$k[0]}->{$k[1]}->{$k[2]}->{$name}=$d->{$l}->{$name} if ( @k == 3 );
#Sofern sich vier Elemente in dem Array befindet => vierte Pfad Ebene
$tree->{$k[0]}->{$k[1]}->{$k[2]}->{$k[3]}->{$id}=$d->{$l}->{$id} if ( @k == 4 );
$tree->{$k[0]}->{$k[1]}->{$k[2]}->{$k[3]}->{$name}=$d->{$l}->{$name} if ( @k == 4 );
}
#Hashreferenz müsste dann so aufgebaut werden:
#100->NAME=Hundert
#100->PATH=100
#100->101->NAME=Hunderteins
#100->101->PATH=100/101
#100->101->102->NAME=Hundertzwei
#100->101->102->PATH=100/101/102
#100->101->102->103->NAME=Hundertdrei
#100->101->102->103->PATH=100/101/102/103
Hey.
Wenn Du schon crosspostest, dann lass' uns hier nicht dumm sterben:
http://board.perl-community.de/thread/10789/
Siechfred