in reply to Deleting undefined entries from DB_FILE hash

hi,

The problem is that the delete($hash{$key}) doesn't seem to actually be deleting the hash

How do you delete undefined hash key?
if hash key is not present, there is nothing to delete. Don't you think so?
Peruse this:

use Data::Dumper; my $family={ father=>'foo', mother=>'bar',}; for(keys %$family){ if(!defined($_)){ delete $family->{$_} } } print Dumper $family; # print out your hash
but if you write this:
use Data::Dumper; my $family={ father=>'foo', mother=>'bar',}; for(keys %$family){ if(defined($_)){ delete $family->{$_} } } print Dumper $family; # print empty hash
I think you might have to look at your code construct again.

UPDATE:
Also in this:

my $file = sprintf('%s/%s/%02x.db', $qdir, $mypc, $i);
Hope, $qdir is decleared somewhere in your code?

Replies are listed 'Best First'.
Re^2: Deleting undefined entries from DB_FILE hash
by gossamer (Sexton) on Jul 23, 2012 at 02:49 UTC

    It just seemed like there was _something_ in that position in the database for it to return the undefined value.

    I thought the issue was that split was being run against a string with null values among the tab delimiter or the entry was somehow otherwise incomplete, leading to the "Use of uninitialized value in split at ./list_hash.pl line 74." that I receive if I remove the prior checks and try and split the string anyway.

    It loks like you've used all different constructs, and I'm not familar with the abstraction your using. It's beyond my level of perl understanding, unfortunately.

    Thanks,
    Alex

      If then you suspect split function, then check what you are getting for each split "action" ( using print ), before assigning them to other variables. like so:

      print join "\n",split /\t/, $hash{$key}, 7;
      See if you have 7 seperate values. If not, then one can say try "\s+" in the split function, instead of the "\t" like so:
      print join "\n",split /\s+/, $hash{$key}, 7;
      If that works, then :-)! You got it!!!

        I've added the following:

        print "\n------------\n"; print join "\n",split /\t/, $hash{$key}, 7;

        This has produced the following output:

        ------------ spam 20120625T115711 14359 Time Attendance Software <rasputin@gustyhelp.info> drape@gustyhelp.info Track employee time and attendance 11.034 ------------ spam 20120627T054428 119032 "CriminalJustice Education" <CollegePrograms@birdddeals.com> CollegePrograms@birdddeals.com Succeed in a Criminal Justice program

        ========

        It may not be clear from the second example, but it only has six fields, where the seventh is blank. It is that condition I'm trying to manage with split and keep it from choking.

        It looks like the last value is null, which must be the type of thing that's choking the split from my example.

        When the database was written, it appears undef'd values were used in some fields where there was no data available.

        Is there another way to split the tab-delimited line other than split() that won't choke?