Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re: Any Point in Uploading Tie::SortedHash

by Anonymous Monk
on Sep 06, 2003 at 16:40 UTC ( [id://289477]=note: print w/replies, xml ) Need Help??

in reply to Any Point in Uploading Tie::SortedHash

Did you know that you can tie to an in-memory BTREE in DB_File to have sorted hashes?

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

Replies are listed 'Best First'.
Re: Re: Any Point in Uploading Tie::SortedHash
by Limbic~Region (Chancellor) on Sep 06, 2003 at 17:38 UTC
    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

      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;
        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

Log In?

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

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2024-06-18 03:40 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.