Schrift
[thread]12451[/thread]

Tree::Simple Bug?

Leser: 3


<< >> 10 Einträge, 1 Seite
pktm
 2008-09-07 01:27
#114315 #114315
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

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

use strict;
use warnings;
use Data::Dumper qw/Dumper/;
use Perl6::Say;
use Tree::Simple;

my $tree = Tree::Simple->new("0", Tree::Simple->ROOT);
my $sub_tree = $tree->addChild(Tree::Simple->new("1"));
$sub_tree->addChildren(
Tree::Simple->new("2.1"),
Tree::Simple->new("2.2")
);

say $tree->getChild("2.1")->getNodeValue();
say $tree->getChild("2.2")->getNodeValue();


und erhalte die Ausgabe:
Quote
2.2
2.2


Aber eigentlich müsste da doch 2.1 und 2.2 kommen?

Kann das mal jemand verifizieren? Ich hab hier AS Perl 5.8.8 mit Tree::Simple 1.18.

Eventuell mache ich ja auc h nur etwas falsch? Aber ich sehe (wie oft bei Fehlern) den Fehler nicht.

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2008-09-07 02:54
#114316 #114316
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
so wie ich die doku verstehe, muss man getChild einen index übergeben, also eine zahl.
Code (perl): (dl )
1
2
print $tree->getChild(1)->getNodeValue();
print $tree->getChild(2)->getNodeValue();

das funktioniert bei mir.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2008-09-07 13:59
#114317 #114317
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Boah, das bedeutet ja, dass ich den ganzen Baum traversieren muss, wenn ich auf das eine Element mit dem NodeValue 2.2 zugreifen will! Ds ist ja voll die Arbeit :-s
http://www.intergastro-service.de (mein erstes CMS :) )
moritz
 2008-09-07 14:22
#114318 #114318
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Wenn du nach Elementen nach Wert suchen willst, empfiehlt es sich einen in irgend einer Weise sortierten Baum zu nehmen, da geht der Zugriff üblicherweise in O(log(n)).
pktm
 2008-09-07 14:25
#114319 #114319
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Naja ich habe hier so Syntaxbäume, die kann ich nicht sortieren (oder?).
http://www.intergastro-service.de (mein erstes CMS :) )
moritz
 2008-09-07 14:35
#114320 #114320
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Wenn du viele Zugriffe nach Wert brauchst und trotzdem nicht sortieren kannst lohnt es sich vielleicht, eine zweite Datenstrukutur aufzubauen in der du nach Wert suchen kannst, und die dann Referenzen auf die unsortierte Datenstruktur enthält.
topeg
 2008-09-07 18:36
#114324 #114324
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Schreib dir doch eine Suchfunktion:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub find
{
  my $tree = shift;
  my $node_value=shift;
  my $last=0;
  my $child;
  my $func;
  $func = sub ($)
  {
    $child=shift();
    $last=1 if($child->getNodeValue() eq $node_value);
    my @children=$child->getAllChildren();
    $func->(shift(@children)) while(@children && !$last);
  };
  $func->($tree);
  return $child if($last);
  return undef;
}

Aufruf:
Code (perl): (dl )
my $node = find($tree,"<NodeValue>")
pktm
 2008-09-07 18:40
#114325 #114325
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Yeah, das ist gut! Danke!
Ideen müsste man haben... :)
http://www.intergastro-service.de (mein erstes CMS :) )
topeg
 2008-09-07 19:08
#114326 #114326
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Und wenn du ein index brauchst:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub hash_nodes
{
  my $tree=shift;
  my %h=();
  my $sub;
  $sub = sub ($)
  {
    my $node=shift;
    my $value=$node->getNodeValue();
    push(@{$h{$value}},$node);
  };
  $tree->traverse($sub);
  return %h;
}


Aufruf:
Code (perl): (dl )
1
2
%index=hash_nodes($tree);
$node=$index{"<NodeValue>"}[0];
topeg
 2008-09-07 19:22
#114328 #114328
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Die Suchfunktion oben hat eine Unzulänglichkeit:
Sie findet immer nur den ersten "Node" zu einem Wert.
Das Macht sie schnell, aber es kann mehrere geben Nodes geben, die den Wert haben.
Darum eine kleine Änderung:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub find
{
  my $tree = shift;
  my $node_value=shift;
  my @childs=();
  my $func;
  $func = sub ($)
  {
    my $child=shift();
    push(@childs,$child) if($child->getNodeValue() eq $node_value);
    my @children=$child->getAllChildren();
    $func->(shift(@children)) while(@children);
  };
  $func->($tree);
  return @childs;
}


Aufruf:
Code (perl): (dl )
my @nodes=find($tree,"<NodeValue>");
<< >> 10 Einträge, 1 Seite



View all threads created 2008-09-07 01:27.