Schrift
[thread]8913[/thread]

eine Frage zu objektorientertem Perl (Seite 5)



<< |< 1 2 3 4 5 6 7 8 ... 15 >| >> 150 Einträge, 15 Seiten
Ronnie
 2007-04-12 17:24
#75837 #75837
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ASDS,12.04.2007, 13:24]so?
Code: (dl )
1
2
3
4
sub ausgabe {

my $refvalue = shift;
my $self = shift;
schaut aber komisch aus.[/quote]
und ist definitiv falsch. Die Objektreferenz wird immer als erstes übergeben. my $self = shift; muss als erstes in der Methode stehen. Dann werden die restlichen Parameter abgefragt.
ASDS
 2007-04-12 17:34
#75838 #75838
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Danke Ronnie ,
Code: (dl )
1
2
   my $class = shift;
my $self = {};
ist dann auch nicht möglich? Schon oder, so steht ja glaub ich auch in der Perl Doc



bezüglich der Hinzufüge Methode hab ich jetzt mal was probiert.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
###############
#Hinzufügen weiterer Äste
###############
sub hinzufuegen {
my $self = shift;
my @newList = my @liste2;
if (defined($self->{ref_wurzel})){
my $list = $self->{@Liste2};
foreach my $neueZweige (@Liste2)
{ push(@$list, $neueZweige); };
$self->{ref_wurzel} = newtree ($list);

}
}


Code: (dl )
1
2
3
4
5
6
7
my $ref_liste1 = shift;
my $zahl = undef;

my $ref_wurzel = knot($zahl);

for $zahl (@$ref_liste1){
my $refvalue = $ref_wurzel;
Aber es funkt trotzdem nicht.
Ronnie
 2007-04-12 17:44
#75839 #75839
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ASDS,12.04.2007, 15:34]
Code: (dl )
1
2
   my $class = shift;
my $self = {};
ist dann auch nicht möglich? Schon oder, so steht ja glaub ich auch in der Perl Doc[/quote]
Doch! Das ist aber nur im Konstruktor - der new-Methode der Klasse möglich. Denn da existiert ja noch kein Objekt - sondern wir erst, in deinem Beispiel - als leere Referenz auf einen Hash definiert. Es wird aber der Klassenname als erstes Argument übergeben. Mit diesem Klassennamen, wird dann die Referenz auf den Hash "gesegnet". Erst dann ist es ein Objekt.

Zum Rest kann ich noch nicht viel sagen, muss ich mal in Ruhe drüber schauen.
ASDS
 2007-04-12 17:51
#75840 #75840
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
So hab gerade eine andere idee... wo die Programmierung meine Hinzufüge Methode dann vielleicht fürn Hugo is...
den Code den ich euch eingestellt hab is für mein .pm

dieses Perl Modul sozusagen möcht ich jetzt in meine .pl einbauen... da hab ich bis jetzt folngedes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use baum;
use strict;

my @liste2 = (4, 28, 9, 100, 12, 84, 10, 11);

# erstell Objekt vom Typ meinem PerlModul
my $Methode = baum->new();

# ruft funktion hinzufuegen aus PerlModul für die Instanz x auf
$Methode->hinzufuegen('@Liste2');


Trotzdem aber muss ich irgendwie noch eine Verbindung zu meiner Sub Methode herstellen. HM, na gut.. ich muss jetzt eh mal weg... ich denk morgen weiter darüber nach, oder heute Abend.

Wünsch euch noch einen schönen Tag
Ronnie
 2007-04-12 18:15
#75841 #75841
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hier mal ein kleines Beispiel wie so ein Baum funktionieren könnte. Aus Bequemlichkeit verwende ich CPAN:Moose und CPAN:overload.
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
#!/usr/bin/perl

use strict;
use warnings;

package LispTree;
use Moose;
use overload '""' => \&to_s;

has 'op' => ( is => 'ro' );
has 'l' => ( is => 'rw' );
has 'r' => ( is => 'rw' );

sub to_s {
my $self = shift;
my $o = '(' . $self->op . ' ';
$o .= ref $self->l ? $self->{l}->to_s : $self->l;
$o .= ' ';
$o .= ref $self->r ? $self->{r}->to_s : $self->r;
$o .= ')';
return $o;
}

package main;

my $root = LispTree->new( op => '+' );
$root->l(12);

my $leaf = LispTree->new( op => '*', l => 15, r => 2 );
$root->r($leaf);

print $root . "\n";

EDIT1: Alternativ nochmal mit einer anderen Traversierung des Baums:
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
#!/usr/bin/perl

use strict;
use warnings;

package LispTree;
use Moose;
use overload '""' => \&to_s;

has 'op' => ( is => 'ro' );
has 'l' => ( is => 'rw' );
has 'r' => ( is => 'rw' );

sub to_s {
my $self = shift;
my $o = '(' . $self->op . ' ';
$o .= ref $self->l ? $self->{l}->to_s : $self->l;
$o .= ' ';
$o .= ref $self->r ? $self->{r}->to_s : $self->r;
$o .= ')';
return $o;
}

sub to_rpn {
my $self = shift;
my $o = ref $self->l ? $self->{l}->to_rpn : $self->l;
$o .= ' ';
$o .= ref $self->r ? $self->{r}->to_rpn : $self->r;
$o .= ' ' . $self->op;
return $o;
}

package main;

my $root = LispTree->new( op => '+' );
$root->l(LispTree->new( op => '+', l => 6, r => 6 ));

my $leaf = LispTree->new( op => '*', l => 15, r => 2 );
$root->r($leaf);

print $root->to_rpn . "\n";

EDIT2: Jetzt auch mal mit der Möglichkeit der Berechnung:
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
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/perl

use strict;
use warnings;

package LispTree;
use Moose;
use overload '""' => \&to_s;

has 'op' => ( is => 'ro' );
has 'l' => ( is => 'rw' );
has 'r' => ( is => 'rw' );

my $operations = {
'*' => sub { $_[0] * $_[1] },
'+' => sub { $_[0] + $_[1] },
'/' => sub { $_[0] / $_[1] },
'-' => sub { $_[0] - $_[1] },
};

sub to_s {
my $self = shift;
my $o = '(' . $self->op . ' ';
$o .= blessed $self->l ? $self->{l}->to_s : $self->l;
$o .= ' ';
$o .= blessed $self->r ? $self->{r}->to_s : $self->r;
$o .= ')';
return $o;
}

sub to_rpn {
my $self = shift;
my $o = blessed $self->l ? $self->{l}->to_rpn : $self->l;
$o .= ' ';
$o .= blessed $self->r ? $self->{r}->to_rpn : $self->r;
$o .= ' ' . $self->op;
return $o;
}

sub calc {
my $self = shift;
my $l = blessed $self->l ? $self->{l}->calc : $self->l;
my $r = blessed $self->r ? $self->{r}->calc : $self->r;
return $operations->{$self->op}->( $l, $r );
}

package main;

my $root = LispTree->new( op => '+' );
$root->l(LispTree->new( op => '+', l => 6, r => 6 ));

my $leaf = LispTree->new( op => '*', l => 15, r => 2 );
$root->r($leaf);

print $root . "\n" x 2 . $root->to_rpn . "\n" . $root->calc . "\n";
\n\n

<!--EDIT|Ronnie|1176399727-->
ASDS
 2007-04-13 01:05
#75842 #75842
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Hallo Ronnie,

ich bin ziemlich beeindruckt, und gleichzeit am Boden zerstört, denn sollten deine Beispiele mein Verbindungsproblem lösen, versteh ich diesen Hinweis nicht.

overload schaut interessant aus, muss ich mir morgen nochmal angucken. Hilft mir overlaod bei meinem Problem?

Schlaf gut
Ronnie
 2007-04-13 01:33
#75843 #75843
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ASDS,12.04.2007, 23:05]overload schaut interessant aus, muss ich mir morgen nochmal angucken. Hilft mir overlaod bei meinem Problem?[/quote]
Hallo ASDS,

overload erlaubt nur das überladen von Operatoren. Ist für dich nicht wirklich wichtig. Moose erlaubt eine bequemere Syntax für OOP in Perl. Ich verwende es weil ich zu faul bin viel zu tippen (und es kann 'ne Menge).

Prinzipiell verstehe ich nicht welchen Sinn der Baum macht, den du aus der Liste nur mit Werten konstruieren willst. Deshalb habe ich ein Beispiel gewählt, das einer typischen Anwendung nahe kommt. Ich habe dein Problem so verstanden, dass dir unklar ist, wie man den Baum traversiert. Eine wichtige Überlegung aus meiner Sicht ist, dass jeder knoten des Baumes ein Objekt der selben Klasse ist. Das Objekt kennt eine Methode zum traversieren (Ich habe zwei Varianten dargestellt). Da jeder Ast entweder ein Wert oder ein weiteres Knotenobjekt ist, musst du schauen ob es sich um eine Referenz auf ein Objekt handelt, oder um einen Wert. Ist es der Wert kann er ausgegeben werden. Ist es ein Objekt, hat es eine Methode zum traversieren die man aufrufen kann.

Wenn du noch Verständnisprobleme mit Referenzen hast, empfehle ich: http://perldoc.perl.org/perlref.html. Ansonsten evtl. noch die Literaturempfehlung: "Algorithmen in Perl", von O'Reilly.

EDIT: Nicht zu vergessen: http://de.wikipedia.org/wiki....sierung

Gruß,
Ronnie\n\n

<!--EDIT|Ronnie|1176413777-->
ASDS
 2007-04-13 10:33
#75844 #75844
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Guten Morgen,

wieder einmal eine schlaflose Nacht.
Guck mal, so hätt ich mir das vorgestellt, Sinn an dem Beispiel ist die Übung.
http://www.fundus.org/pdf.asp?ID=239

Ich hab doch nur das Problem, wie ich das Hinzufügen der einzelnen Blätter ( Äste - wie auch immer) lösen kann.
Das ganze soll doch auch nur ne Artübung sein. OOP möcht ich in Zukunft glaub ich eh nicht machen, außer mir geht der Knopf auf.

vielleicht kann ich es dir nochmal schildern...
Das Programm soll einen Baum erstellen... einen Baum als Zahlen welche es vom User bekommt. Zur Übung, soll es dann möglich sein dass dieses Programm dem Baum nach Usereingabe nochmals Werte zuweißt. Die Liste 2 ist default mäßig angegeben. im File .pl .

Jetzt hab ich aber folgendes Problem, dass im sub newtree zwar die Erstellung der Liste 1 vollzogen wird und das gleiche soll dann eben auch mit Liste 2 passieren unter berücksichtigung von Liste1. Und da hab ich momentan Knopf im Kopf.
Ronnie
 2007-04-13 12:22
#75845 #75845
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=ASDS,13.04.2007, 08:33]Guck mal, so hätt ich mir das vorgestellt, Sinn an dem Beispiel ist die Übung.
http://www.fundus.org/pdf.asp?ID=239[/quote]
Okay, jetzt wird es klarer. Deshalb auch die binären Bäume. Auf die Idee bin ich nicht gekommen, weil man Listen in Perl i.A. per sort sortiert. Das Problem ist aber prinzipiell das Selbe wie bei der Ausgabe -> Traversierung. Ich tippe später mal 'nen Entwurf wo man das sieht. An dieser Stelle mal noch den Hinweis auf CPAN:Data::Dumper. Damit kannst du dir Datenstrukturen anschauen: print Dumper $tree. Ist oft recht hilfreich wenn man nicht so genau nachvollziehen kann was passiert.
ASDS
 2007-04-13 13:57
#75846 #75846
User since
2007-01-29
115 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    if ($zahl) 
{
while {
############################
#Beginn des Vergleichs

if($zahl < $$refvalue{'zahl'}) {
if(defined($$refvalue{'linksweg'}))
{
$refvalue = $$refvalue{'linksweg'};
}
else {
$$refvalue{'linksweg'} = knot($zahl);
last; #Ende
}
}

Irgendwo hier ist ein Synatx error. Hab schon gschaut find aber nix... seht ihr ihn?
<< |< 1 2 3 4 5 6 7 8 ... 15 >| >> 150 Einträge, 15 Seiten



View all threads created 2007-04-10 15:14.