use strict; use warnings; my $r = 0; $r = { rest => $r, first => 'c' }; $r = { rest => $r, first => 'b' }; $r = { rest => $r, first => 'a' }; print join " ", value($r), scalar value($r); sub value { my $self = $_[0]; if (wantarray) { my @value; while ($self) { push @value, $self->{'first'}; $self = $self->{'rest'}; } return @value; } my $c; while ($self) { $c++; $self = $self->{'rest'}; } return $c; }