#!/usr/bin/perl { package Obj; my $next_id = 0; our %linklist; sub new { my($class, $label, $prev, $next) = @_; my $id = $next_id++; my $prev_id = $prev->{id}; my $next_id = $next->{id}; my $self = bless { id => $id, label => $label, prev => $prev_id, next => $next_id, }, $class; $prev->{next} = $id; $next->{prev} = $id; $linklist{$id} = $self; $self; } sub next { my $self = shift; if (defined $self->{next}) { $linklist{$self->{next}}; } } sub prev { my $self = shift; if (defined $self->{prev}) { $linklist{$self->{prev}}; } } sub traverse_forward { my($self) = @_; print $self->{label}; while(defined $self->{next}) { $self = $linklist{$self->{next}}; print " " . $self->{label}; } print "\n"; } sub traverse_backward { my($self) = @_; print $self->{label}; while(defined $self->{prev}) { $self = $linklist{$self->{prev}}; print " " . $self->{label}; } print "\n"; } sub DESTROY { warn "DESTROY @_"; } } { package Obj2; use Scalar::Util qw(weaken); sub new { my($class, $label, $prev, $next) = @_; my $self = bless { label => $label, prev => $prev, next => $next, }, $class; $prev->{next} = $self; $next->{prev} = $self; # weaken $self->{prev} if $self->{prev}; # Hier! # weaken $next->{prev} if $next->{prev}; # Hier! $self; } sub next { my $self = shift; $self->{next}; } sub prev { my $self = shift; $self->{prev}; } sub traverse_forward { my($self) = @_; print $self->{label}; while(defined $self->{next}) { $self = $self->{next}; print " " . $self->{label}; } print "\n"; } sub traverse_backward { my($self) = @_; print $self->{label}; while(defined $self->{prev}) { $self = $self->{prev}; print " " . $self->{label}; } print "\n"; } sub DESTROY { warn "DESTROY @_"; } } { my $x1 = Obj->new("Null", undef, undef); my $x2 = Obj->new("Eins", $x1, undef); my $x3 = Obj->new("Zwei", $x2, undef); $x1->traverse_forward; $x3->traverse_backward; %Obj::linklist = (); } { my $x1 = Obj2->new("Null", undef, undef); my $x2 = Obj2->new("Eins", $x1, undef); my $x3 = Obj2->new("Zwei", $x2, undef); $x1->traverse_forward; $x3->traverse_backward; }