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