Schrift
[thread]10789[/thread]

Hashreferenz nach Anzahl Array Elemente

Leser: 1


<< >> 5 Einträge, 1 Seite
Gast Gast
 2007-11-13 15:31
#102357 #102357
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. Beispiel mit 4 Ebene brauch aber leider unendliche Ebenen.
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
nepos
 2007-11-13 16:58
#102369 #102369
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bitte [ code] [ /code] oder [ per ] [ /perl] benutzen!
Taulmarill
 2007-11-13 18:09
#102371 #102371
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Suchst du so was in der Art?

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $path = '100/101/102/103';
my $name = 'Hundertdrei';
my %tree;

my $ref = \%tree;
for my $dir ( split qr~/~, $path ) {
    $ref->{$dir} = {} unless exists $ref->{$dir};
    $ref = $ref->{$dir};
}
$ref->{NAME} = $name;
$ref->{id}   = $path;

print Dumper \%tree;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Gast Gast
 2007-11-13 18:49
#102372 #102372
Hallo,

danke zunächst für die Antwort.

Im Prinzip ist es schon das was ich suche, aber damit bekomme ich nur einen Baum bis zur angezeigt. Ich muss aber auch wissen, wie die anderen Ordner heißen. Die Struktur sollte ungefähr so aussehen.

$VAR1 = {
'100' => {
'101' => {
'102' => {
'ID' => '100/101/102',
'NAME' => 'Hundertzwei'
}
},
'ID' => '100/101',
'NAME' => 'Hunderteins'
},
'ID' => '100',
'NAME' => 'Hundert'
};

Gruß

Slaughter
#Kein Kommentar
 2007-11-13 21:49
#102378 #102378
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
tut mir leid, da kann ich nichts richtig erkennen.
benutz bitte tabs und
code-tags und schreibe es nochmal richtig

is vllt ein bisschen penibel, aber jeder programmierer sollte nen bissel disziplin haben, oder?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
<< >> 5 Einträge, 1 Seite



View all threads created 2007-11-13 15:31.