Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
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 studying the Monastery: (6)
As of 2025-06-12 16:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.