1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl $list = $tail = undef; foreach (1..5) { my $node = [ undef, $_ * $_ ]; $list = undef; $tail = \$list; foreach (1..5) { my $node = [ undef, $_ * $_ ]; $$tail = $node; $tail = \$node->[NEXT]; } }
2012-11-21T08:06:34 DarKo87Im Allgemeinen habe ich verstanden wie eine Kette Funktioniert, kenne das
Prinzip aus C sehr gut.
QuoteHab bei Google schon gesucht und mir das ganze irgendwie über Binärebäume
versucht zu erklären
2012-11-21T08:21:46 biancaSag doch einfach mal, was du für Daten hast und was damit passieren soll.
In Perl kann man einiges unerwartet einfach lösen.
2012-11-21T08:28:22 DarKo87Aber ich versuche mal die Aufgabenstellung zu erläutern. Ich soll mit Listen das Prinzip der Verketteten Liste aufbauen. Es gibt also immer eine "Eingabe" und der darauffolgende Speicher verweist immer auf die nächste Eingabe bzw. Liste in der die Eingabe steht.
2012-11-21T08:31:23 biancaDas ist wohl eher was für Theoretiker. Ich brauche immer eine praktische Aufgabenstellung sonst kann ich damit nichts anfangen :)
2012-11-21T08:55:51 DarKo87Wie würde den eine Praktische Aufgabe mit dem Prinzip aussehen? Vielleicht komm ich so etwas voran *g
2012-11-21T08:21:46 biancaIn Perl kann man einiges unerwartet einfach lösen.
push @historie, $value
2012-11-22T12:20:19 GUIfreundich glaube, du kannst in Perl die ganze Sache mit den verketteten Listen vergessen. Speichere einfach jedes $value in einem Array:
2012-11-22T12:36:39 Raubtier[...]
Ich würde sogar soweit gehen und sagen, dass Arrays auch in anderen Sprachen fast immer die beste Wahl sind (bzw. man sollte schon einen sehr guten Grund haben, eine Liste zu nehmen).
[...]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my $first; my $prev_node; for (1..5) { my $node = { value => $_, prev => $prev_node }; $first //= $node; $prev_node->{next} = $node; $prev_node = $node; } my $node = $first; while ($node) { say $node->{value}; $node = $node->{next}; }
2012-11-21T09:17:47 MuffiSowas in der Art vielleicht?
$first //= $node;
$prev_ref->{next} = $node ;
2012-11-21T09:33:03 DarKo87Leider
funktioniert es nicht. Ist die Zeile so richtig ?Code: (dl )$first //= $node;
2012-11-21T09:33:03 DarKo87Aber ein paar fragen zum Code.
Ist prev nen befehl? Kann es im meinem Buch "Perl Kurz & Gut" nicht finden.
Was genau geschieht an dieser stelleCode: (dl )$prev_ref->{next} = $node ;
2012-11-21T09:33:03 DarKo87Danke erstmal für die mühe. Ich habe versucht den Code auszuführen. Leider
funktioniert es nicht. Ist die Zeile so richtig ?Code: (dl )$first //= $node;
QuoteAber ein paar fragen zum Code.
Ist prev nen befehl? Kann es im meinem Buch "Perl Kurz & Gut" nicht finden.
Was genau geschieht an dieser stelleCode: (dl )$prev_ref->{next} = $node ;
QuoteDer Wert von $node wird in prev_ref mit referenz auf next gespeichert? Also ich versuch es zu verstehen.
QuoteWas genau stellt node jetzt dar? Ein String oder Hash?
QuoteOops, vergessen. Schreib mal das drüber:
$first //= $node;
QuoteQuoteAber ein paar fragen zum Code.
Ist prev nen befehl? Kann es im meinem Buch "Perl Kurz & Gut" nicht finden.
Was genau geschieht an dieser stelleCode: (dl )$prev_ref->{next} = $node ;
Nein, das ist kein Befehl. Du kannst es auch in Anführungszeichen setzen, vielleicht ist es dann klarer. Das ist ein String, also der Bezeichner einen Hashkeys.
$first = $node unless defined $first;
say $node->{value};
print $node->{value}."\n";
QuoteCode (perl): (dl )$prev_ref->{next} = $node ;
Achso, also setze ich den wert von $node auf $prev_ref->{next} ( als referenz sozusagen einen wert höher bzw. an die nächste speicherstelle )
my $node = { value => $_, prev => $prev_ref };
$first = $node unless defined $first;
$prev_ref->{next} = $node ;
$prev_ref = $node;
Quote$node{value} = 1; und dann sagst du der vohrige wert ist $prev_ref.
Richtig?
QuoteWenn ich das verstanden habe, wäre es dann nicht korrekt wenn man im "ersten" fall prev_ref auf NULL bzw. undef oder auf den speicher von value setzen würde?
QuoteHmm, unless defined hab ich bissher noch nicht genutzt. Ich glaube $node wird auf $first nur geschrieben wenn $first noch undef ist. Richtig?
QuoteWieso der vorgänger dann auch gesagt das er $node ist?
1
2
3
4
5
6
7
8
9
10
11
12
13
for (1..5) {
$list[$_][0] = <>;
my $node = { value => $list[$_], prev => $prev_ref };
$first = $node unless defined $first;
$prev_ref->{next} = $node ;
$prev_ref = $node;
}
my $node = $first;
while ($node) {
print $node->{value}, "\n";
$node = $node->{next};
}
my $node = { value => ..., prev => ..., next => undef };
2012-11-21T10:56:48 MuffiAchja, was mir grad aufgefallen ist:
Du könntest bei $node auch gleich einen next mit undef setzen beim Erstellen.
Code (perl): (dl )my $node = { value => ..., prev => ..., next => undef };
Ansonsten ist es ein bisserl unhübsch/inkonsistent, weil das erste Element einen prev mit undef hat, das letzte Element aber keinen key, der next heisst.
Das ist zwar meist nicht tragisch, weil Perl einen Hashkey bei Bedarf (Zugriff) anlegt und den mit undef initialisiert. Im Endeffekt kommt also meist das Gleiche raus, aber gefalln tuts mir nicht sonderlich.
2012-11-21T11:00:28 MuffiWas verstehst du denn unter dem "Wert" eines Arrays?
$node->{value}->[0];
QuoteHmm, unless defined hab ich bissher noch nicht genutzt. Ich glaube $node wird auf $first nur geschrieben wenn $first noch undef ist. Richtig?
2012-11-21T09:52:33 DarKo87Danke für die gute erklärung. Aber wir haben in der Firma, aus welchen Gründen auch immer, noch Perl 5.8.
2012-11-21T12:37:13 pqich nehme die diskussion mal zum anlass, dir ein tutorial zu empfehlen:
http://perl-tutorial.org/
z.b. "modern perl - the book"
es gibt da ein paar defizite, und ich glaube, du solltest dir da mal kurz zeit nehmen und ein paar basiskenntnisse aneignen.
strict und warnings fehlen, und das mit prev scheint irgendwie immer noch nicht ganz klar zu sein.
2012-11-21T13:06:40 MuffiERST Doku lesen
DANN beantworten.
Das erhöht die Chance, dass die Antwort dann auch stimmt.
2012-11-21T12:55:56 MuffiWenn du das Tutorial durch hast und auch das Kapitel mit Hashes gelesen hast kannst du ja nochmal im Forum vorbeischaun und beantworten, warums eine Funktion prev in Perl 5.8 nicht gibt, das Programm aber trotzdem anstandslos funktioniert.
Quoteprev ist keine funktion sondern nen value und der key dazu ist lediglich ne referenz
2012-11-21T13:39:11 MuffiQuoteprev ist keine funktion sondern nen value und der key dazu ist lediglich ne referenz
Wenn du jetzt "value" und "key" noch vertauscht lass ichs gelten.
2012-11-21T12:51:42 DarKo87Danke, aber ich habe bereits Bücher "Einführung in Perl" von O'Reilly verlag. Desweiteren hab ich Seminarunterlage von GNC und Perl "Kurz & Gut".
QuoteStrict und warnings führe ich beim Code nicht auf, so etwas ist standart und da ich den code laut "read first posting" kurz halten soll, entfällt das bei mir.
2012-11-21T13:08:22 pqQuoteStrict und warnings führe ich beim Code nicht auf, so etwas ist standart und da ich den code laut "read first posting" kurz halten soll, entfällt das bei mir.
es heisst standard und nicht standart.
aber ich glaube dir das nicht. in deinem beispielcode steht:
$list = $tail = undef;
ganz am anfang.
das würde mit strict gar nicht funktionieren.
daher habe ich es auch erwähnt.
QuoteDarKo87
Danke, aber ich habe bereits Bücher "Einführung in Perl" von O'Reilly verlag. Desweiteren hab ich Seminarunterlage von GNC und Perl "Kurz & Gut".
war nur ein gutgemeinter rat.
die tutorials, die da gelistet sind, sind aktuell. und kostenlos.
2012-11-21T13:10:26 DarKo87Aktuelle Unterlagen bringen mir meistens auch nichts, weil wir hier im Konzern noch mit 5.8.8 arbeiten. Daher manche funktionen ja leider nicht verfügbar sind.
QuoteVermutlich dürfte der Perl-Datentyp "Liste" im Perl-Interpreter in C als "verkettete Liste" implementiert sein.
SV** xav_alloc; /* pointer to beginning of C array of SVs */
Quotehttp://www.perltutorial.org/perl-linked-list.aspx
zeigt nun gerade einen fortgeschrittenen Sonderfall. Für Leute, die Perl lernen wollen, halte ich es eher für kontraproduktiv, sich damit zu beschäftigen.
2012-11-22T23:08:30 RaubtierSchaue dir bitte einmal den C-Befehl realloc an! Klappt das nicht, muss man halt umkopieren. Man macht das Array aber in der Regel größer als die Anzahl der Elemente, sodass man ohne Größenänderung noch was einfügen kann. Erst wenn die Maximalgröße überschritten würde, muss man das Array größer machen.
QuoteSelbstverständlich handelt es sich um arrays!
QuoteAußerdem verwirrst du, indem du my @l eine Liste nennst. @l ist ein Array. Eine Liste in Perl ist etwas wie (1,2,3).
perldoc -q 'difference between a list and an array'
QuoteAn array has a changeable length. A list does not.