Antonio Gulli wrote:

> 
>>>My idea is rather simple:
>>>
>>>my (@listOfHashes);
>>>my ($numOfHashes);
>>>
>>>sub loadDBs{
>>>
>>>    my ($dbDIR) = @_;
>>>    my ($numFiles) = 0;
>>>    my ($b) = new DB_File::BTREEINFO;
>>>    my ($file);
>>>
>>>    $numOfHashes = 0;
>>>
>>>    opendir(DIR, $dbDIR) || die "cannot opendir $dbDIR: $!";
>>>    while (defined($file = readdir(DIR))){
>>> 
>>>       if ($file =~ /db\.*/){
>>>          tie %{ $listOfHashes[$numOfHashes] }, "DB_File", $file, 
>>>    
>>>
>>
>>You might try :  "$dbDIR/$file" instead of $file to pick up the full
>>path to the file.
>>
>>  
>>
>>>            O_RDONLY, 0666, $b
>>>          || die ("Cannot open $file");
>>>          $numOfHashes++;
>>>          print "Tied $file $numOfHashes\n";
>>>       }
>>>    }
>>>    
>>>
> Added     print Dumper([EMAIL PROTECTED]); here

Try dumping $file and $dbDIR - I want to verify they're correct.
And what dir are you running it from ?

If that doesn't help, use a simpler construct and see what you get.

>>>}
>>>
>>>sub dumpAll_Key_Value{
>>>    
>>>    my ($key, $value);
>>>    for (my $i = 0; $i < $numOfHashes; $i++){
>>>      print "Load $i";
>>>      while (($key, $value) = keys %{ $listOfHashes[$i] }){
>>>        print ">$key< >$value<\n";
>>>       }
>>>    }
>>>}
>>>
>>>sub searchKey{
>>>
>>>    my ($key) = @_;
>>>    my ($fetched);
>>>    for (my $i = 0; $i < $numOfHashes; $i++){
>>>      if (defined ($fetched = $listOfHashes[$i]{$key})){
>>>        print "found $key on $i DB";
>>>        return $fetched;
>>>      }
>>>    } 
>>>  return undef;
>>>}
>>>
>>>But neither searchKey() nor dumAll_Key_Value() seems to work,
>>>while loadDBs() seems to tie the hashes...
>>>
>>>Am i doing a trivial error or what? Any suggestion?
>>>    
>>>
>>
>>You could also try dumping listOfHashes using Data::Dumper and
>>see what you get.
>>  
>>
> And obtained (this is a directory with just a DB file, so i have
> just one hash inside, the same happens with directory with many files).
> 
> $VAR1 = [
>       {}
>       ];
> 
> So the hash is empty, but why the tie operation does not fail ?
> Should the hash be empty when i tie it to a DB_File?

I didn't test the BTREE part, the the rest seems ok using a regular
DB_FILE file :

use Fcntl;
use Tie::Hash;
use DB_File;

my @hash_names;
my @listOfHashes;
my $numOfHashes;

loadDBsu (shift || 'data');
# print Data::Dumper->Dump([EMAIL PROTECTED], [qw([EMAIL PROTECTED])]) if $debug;
dumpAll_Key_Value ();
my $ret = searchKey (shift || 'Dan');
print "\n$ret\n" if $ret;
exit;


sub loadDBsu {
        my $dbDIR = shift;
        my $b = new DB_File::BTREEINFO;

my $numFiles = 0;
my $file;
opendir DIR, $dbDIR or die "cannot opendir $dbDIR: $!";
while (defined ($file = readdir DIR)) {
        if ($file =~ /db/i) {
                my %hash;
                tie %hash, 'DB_File', "$dbDIR/$file", O_RDONLY, 0666, $b or do {
                        warn "Cannot tie $dbDIR/$file";
                        next;
                };
                push @hash_names, "$dbDIR/$file";
                push @listOfHashes, \%hash;
                $numOfHashes++;
                print "Tied $file $numOfHashes\n";
        }
}
closedir DIR;

}

sub dumpAll_Key_Value {

for (my $ii = 0; $ii < @listOfHashes; $ii++) {
        print "Loading $hash_names[$ii]\n";
        while (my ($key, $value) = each %{$listOfHashes[$ii]}) {
                print "'$key' => '$value'\n";
        }
}

}

sub searchKey {
        my $key = shift;

for (my $ii = 0; $ii < @listOfHashes; $ii++) {

        my $fetched = $listOfHashes[$ii]->{$key};
        if (defined $fetched) {
                print "found $key in $hash_names[$ii]\n";
                return $fetched;
        }
}
return undef;

}

__END__

-- 
  ,-/-  __      _  _         $Bill Luebkert    Mailto:[EMAIL PROTECTED]
 (_/   /  )    // //       DBE Collectibles    Mailto:[EMAIL PROTECTED]
  / ) /--<  o // //      Castle of Medieval Myth & Magic http://www.todbe.com/
-/-' /___/_<_</_</_    http://dbecoll.tripod.com/ (My Perl/Lakers stuff)

_______________________________________________
Perl-Unix-Users mailing list
[EMAIL PROTECTED]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to