I have enclosed my proposed first draft of code as well as some comparisons with the original. Please provide your feedback on the code as well as any other advice that might be helpful.
package Tie::SortHash; use strict; use constant HASH => 0; use constant LOOKUP => 1; use constant ARRAY => 2; use constant SORT => 3; use constant CHANGED => 4; use vars qw($VERSION); $VERSION = '1.02'; sub TIEHASH { my $class = shift; my $hash = shift || {}; my $sort = shift || q($a cmp $b || $a <=> $b); my $self = bless [], $class; $self->_Build($hash, $sort); return $self; } sub FETCH { my($self, $key) = @_; $self->[HASH]{$key}; } sub STORE { my($self, $key, $value) = @_; $self->[HASH]{$key} = $value; $self->[CHANGED] = 1; } sub EXISTS { my($self, $key) = @_; return exists $self->[HASH]{$key}; } sub DELETE { my($self, $key) = @_; delete $self->[HASH]{$key}; splice(@{$self->[ARRAY]}, $self->[LOOKUP]{$key}, 1); delete $self->[LOOKUP]{$key}; } sub FIRSTKEY { my $self = shift; $self->_ReOrder if $self->[CHANGED]; $self->_Iterate; } sub NEXTKEY { my ($self, $lastkey) = @_; $self->_ReOrder if $self->[CHANGED]; $self->_Iterate($self->[LOOKUP]{$lastkey}); } sub CLEAR { my $self = shift; $self->[HASH] = {}; $self->[CHANGED] = 1; } sub DESTROY { } sub _Build { my ($self, $hash, $sort) = @_; @{$self->[HASH]}{keys %$hash} = values %$hash; $self->sortblock($sort); $self->_ReOrder; } sub _ReOrder { my $self = shift; $self->[LOOKUP] = (); $self->[ARRAY] = (); my $index = 0; my $hash = $self->[HASH]; for my $key (eval $self->[SORT]) { $self->[LOOKUP]{$key} = $index; $self->[ARRAY][$index] = $key; $index++; } $self->[CHANGED] = 0; } sub _Iterate { my ($self, $index) = @_; $index = -1 unless defined $index; $index++; defined $self->[ARRAY][$index] ? $self->[ARRAY][$index] : undef; } sub sortblock { my($self, $sort) = @_; my $hash = $self->[HASH]; $sort =~ s/\$hash/\$hash->/g; $self->[SORT] = "sort { $sort } keys %\$hash"; eval $self->[SORT]; die $@ if $@; $self->[CHANGED] = 1; } 1;
Thanks in advance. I will by flying to Dallas tomorrow (10 Aug 03), so I apologize in advance for not being able to reply immediately.
Cheers - L~R
|
---|