Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Re: Any Point in Uploading Tie::SortedHash

by Limbic~Region (Chancellor)
on Sep 06, 2003 at 17:38 UTC ( [id://289486]=note: print w/replies, xml ) Need Help??


in reply to Re: Any Point in Uploading Tie::SortedHash
in thread Any Point in Uploading Tie::SortedHash

Anonymous Monk,
No, I didn't know that. Being a novice when it comes to databases, it sounds complicated. Has anyone written a module that utilizes this for having sorted hashes? I would be interested in knowing if this technique was capable of supporting all the features in my module. I am always interested in learning alternate/better ways of doing things.

Cheers - L~R

  • Comment on Re: Re: Any Point in Uploading Tie::SortedHash

Replies are listed 'Best First'.
Re: Re: Re: Any Point in Uploading Tie::SortedHash
by danger (Priest) on Sep 06, 2003 at 17:57 UTC

    It isn't complicated at all, and you do not need any modules beyond DB_File itself (which is part of the standard distro).

    Tieing to a DB_File BTREE is no harder than tie'ing to anything else --- to keep it in memory (instead of in a file) just use undef in place of the filename argument. You can easily supply custom sort routines (default is lexical sorting).

    use DB_File; $DB_BTREE->{compare} = sub { $_[1] cmp $_[0] }; tie my %h, 'DB_File', undef, O_RDWR|O_CREAT, 0666, $DB_BTREE or die "DB_File tie failed: $!"; %h = 'a' .. 'z'; print "$_ : $h{$_}\n" for keys %h;
      danger,
      This looks potentially really cool and I would like to incorporate this technique as one of the possible options of my module. The problem is I can't seem to get DB_BTREE->{compare} to do anything meaningful. I get the same result no matter what I make the sort routine.
      #!/usr/bin/perl -w use strict; use DB_File; tie my %h, 'DB_File', undef, O_RDWR|O_CREAT, 0666, $DB_BTREE or die "DB_File tie failed: $!"; #$DB_BTREE->{compare} = sub { $h{$_[1]} <=> $h{$_[0]} }; #$DB_BTREE->{compare} = sub { $h{$_[0]} <=> $h{$_[1]} }; #$DB_BTREE->{compare} = sub { $_[0] cmp $_[1] }; #$DB_BTREE->{compare} = sub { $_[1] cmp $_[0] }; %h = ( 'John' => 33, 'Jacob' => 29, 'Jingle' => 15, 'Heimer' => 48, 'Smitz' => 12, ); print "$_ : $h{$_}\n" for keys %h;

      What am I missing? - L~R

        Set $DB_BTREE->{compare} before tieing the hash. However, accessing the tied hash in the compare routine leads to deep recursion (FETCH method uses the compare routine to navigate the tree).

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://289486]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (7)
As of 2024-04-20 20:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found