Schrift
[thread]8665[/thread]

Welcher Hash beinhaltet den Namen des anderen Hash



<< >> 9 Einträge, 1 Seite
pktm
 2007-01-21 12:00
#73411 #73411
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Ich habe folgende Datenstruktur:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
my %s = (
s241_504 => {
'cat' => 'S',
'edge' => [
{
'idref' => 's241_508',
'label' => 'SB'
},
{
'idref' => 's241_3',
'label' => 'HD'
},
{
'idref' => 's241_503',
'label' => 'OC'
}
]
},
s241_503 => {
'cat' => 'S',
'edge' => [
{
'idref' => 's241_506',
'label' => 'SB'
},
{
'idref' => 's241_6',
'label' => 'HD'
},
{
'idref' => 's241_507',
'label' => 'OA'
},
{
'idref' => 's241_501',
'label' => 'OP'
},
{
'idref' => 's241_502',
'label' => 'MO'
}
]
},
);


WIe bekomme ich bei dieser Datenstruktur heraus, welcher Eintrag welchen beinhaltet? Wenn man das al Hierarchie ansieht, welcher Eintrag steht dann ganz oben (beinhaltet alle anderen)?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Ronnie
 2007-01-21 12:14
#73412 #73412
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Keiner! Ein Hash hat nie eine Ordnung auf die du dich verlassen könntest (okay, es gibt Tie::IxHash). Nur die anonymen Arrays unter dem Schlüssel 'edge' weisen eine Ordnung auf, die wie bei allen Arrays per Index gegeben ist.

Wenn du eine Ordnung benötigst dann musst du dir die Schlüssel sortieren per: my @ordered_keys = sort keys %s;\n\n

<!--EDIT|Ronnie|1169374614-->
topeg
 2007-01-21 12:18
#73413 #73413
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Auf den ersten Blick erinnert mich das an die Datenbankstruktur eines hirarchischen Forums, aber auf der anderen Seite sieht es aus wie mit XML::Simple geparstes Dokument.
Mir fällt auf, das "s241_503" sowohl als primärer Schlüssel auftaucht, als auch als sekundärer.

Ohne weitere Informationen kann ich kaum etwas dazu sagen. außer, daß du versuchen kannst diese Struktur als Baum aufzulösen, indem du in "edge" nach "idref"-Schlüsseln suchts die auch direkt vorkommen. löscht du "idref" und schreibst als "ref" drekt den Wert zum Schlüssel da rein.

Dadrch bekommst du eine Baumstruktur in dem es, im Idealfall, keine "idref" mehr gibt.
Aber ich weiß nicht ob du dir sowas vorgesetllt hast...
Allso mehr informationen bitte.
Was soll die Struktur darstellen?
Was genau willst du damit machen?
Wie soll das Endergebis aussehen?\n\n

<!--EDIT|topeg|1169374787-->
Ronnie
 2007-01-21 12:34
#73414 #73414
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hier mal ein Snippet wenn du z.B. nach einer bestimmten idref suchst und wissen willst unter welchem key diese in %s vorkommt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub search_idref {
my $haystack = shift;
my $needle = shift;

my @pitchfork = sort keys %$haystack;
my @solutions;

for my $p (@pitchfork) {
push @solutions, $p if grep
{ $_->{'idref'} eq $needle } @{$haystack->{$p}->{'edge'}};
}
return @solutions;
}

print Dumper search_idref( \%s, 's241_506' );

Wobei sich solche Sachen ab einer gewissen Komplexität mit OO besser lösen lässt!\n\n

<!--EDIT|Ronnie|1169375688-->
pktm
 2007-01-21 12:35
#73415 #73415
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=Ronnie,21.01.2007, 11:14]Keiner! Ein Hash hat nie eine Ordnung auf die du dich verlassen könntest (okay, es gibt Tie::IxHash). Nur die anonymen Arrays unter dem Schlüssel 'edge' weisen eine Ordnung auf, die wie bei allen Arrays per Index gegeben ist.

Wenn du eine Ordnung benötigst dann musst du dir die Schlüssel sortieren per: my @ordered_keys = sort keys %s;[/quote]
Ich glaube du hast mich missverstanden. Ich möchte diesen Hash nicht sortieren. DIeser Hash ist die Repräsentation einer hierarchischen Satzstruktur, In jedem Element steht drin, welche anderen Elemente von diesem Knoten dominiert werdne (unter $knoten->{edges}->[irgendwas]->{idref}). Und ich möchte jetzt möglichst effizient wissen, welcher der Hasheinträge (wobei die Sortierung natürlich arbiträr ist, da Hash) in eben $knoten->{edges}->[irgendwas]->{idref} den Schlüssel eines anderen Knotens als String enthält.

So enthält in meinem Beispiel der Kontoten s241_504 eine Referenz (nicht im Perlschen Sinne sondern im Sinne von "da wurde es sich gemerkt welche Struktur da kommt") auf s241_503.
s241_504 dominiert folglich s241_503.

Nur wie bekomm eich das ohne zig Schleifen heraus?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pktm
 2007-01-21 12:37
#73416 #73416
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=Ronnie,21.01.2007, 11:34]Hier mal ein Snippet wenn du z.B. nach einer bestimmten idref suchst und wissen willst unter welchem key diese in %s vorkommt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub search_idref {
   my $haystack = shift;
   my $needle = shift;
   
   my @pitchfork = sort keys %$haystack;
   my @solutions;
   
   for my $p (@pitchfork) {
       push @solutions, $p if grep
           { $_->{'idref'} eq $needle } @{$haystack->{$p}->{'edge'}};
   }
   return @solutions;
}

print Dumper search_idref( \%s, 's241_506' );

Wobei sich solche Sachen ab einer gewissen Komplexität mit OO besser lösen lässt![/quote]
Ja, das sieht doch gut aus, so ähnlich habe ich es auch versucht, nur scheitere ich immer an eben jener Komplexität :)

Danke!
http://www.intergastro-service.de (mein erstes CMS :) )
Ronnie
 2007-01-21 14:59
#73417 #73417
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,21.01.2007, 11:37]Ja, das sieht doch gut aus, so ähnlich habe ich es auch versucht, nur scheitere ich immer an eben jener Komplexität :)[/quote]
@pktm: Evtl. ist ja CPAN:GraphViz für dich in diesem Zusammenhang nützlich:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use GraphViz;

sub as_graph {
my $haystack = shift;
my @pitchfork = sort keys %$haystack;

my $g = GraphViz->new();

for my $p (@pitchfork) {
$g->add_edge($p, $_->{'idref'}) for @{$haystack->{$p}->{'edge'}};
}
return $g->as_text;
}

print as_graph( \%s );

Sieht im Endergebnis dann ungefähr so aus:
http://www.ronnie-neumann.de/trashbin/haystack.png
pktm
 2007-01-21 15:40
#73418 #73418
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, das Modul hatte ich mir schon angesehen, aber aufgrund meiner unsoliden Kenntisse erstmal zurück gestellt. Zur Zeit möchte ich erstmal den Syntaxbaum in einem Tree-Simplye-Obekt aufbauen, welches ich dann für meine Aufgaben missbrauchen kann. Zur Zeit lasse ich esm ir von Data::TreeDumper oder Tree::Visualize ausgeben.

Kann GraphViz auch auf eine Canvas malen? So dass man die Elemente anklicken kann? Ich habe mir bis dato Tk::TreeGraph zu Nutze gemacht, aber das ist so hässlich eckig :)

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Ronnie
 2007-01-21 16:16
#73419 #73419
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,21.01.2007, 14:40]Kann GraphViz auch auf eine Canvas malen? So dass man die Elemente anklicken kann?[/quote]
Nein, nicht das ich mich erinnere. Es kann glaube ich ImageMaps für HTML erzeugen.

PS.: CPAN:Tree::Visualize sieht ziemlich Schmuck aus!\n\n

<!--EDIT|Ronnie|1169389029-->
<< >> 9 Einträge, 1 Seite



View all threads created 2007-01-21 12:00.