in reply to Strange problem with Config::General

Tip #4 from the Basic debugging checklist (Data::Dumper):

my %config = $conf->getall; use Data::Dumper; print Dumper(\%config);

The 7/16 looks like perldata...

If you evaluate a hash in scalar context, it returns false if the hash is empty. If there are any key/value pairs, it returns true; more precisely, the value returned is a string consisting of the number of used buckets and the number of allocated buckets, separated by a slash. This is pretty much useful only to find out whether Perl's internal hashing algorithm is performing poorly on your data set. For example, you stick 10,000 things in a hash, but evaluating %HASH in scalar context reveals "1/16" , which means only one out of sixteen buckets has been touched, and presumably contains all 10,000 of your items. This isn't supposed to happen. If a tied hash is evaluated in scalar context, the SCALAR method is called (with a fallback to FIRSTKEY ).

Replies are listed 'Best First'.
Re^2: Strange problem with Config::General
by OfficeLinebacker (Chaplain) on Nov 18, 2013 at 16:03 UTC
    Hi. I agree, it looks like perldata. I tried Data:Dumping the value and I got $VAR1 = { '7/16' => undef }; So is that a dead end?

      Try dumping your $conf object just to be sure the problem isn't on that side (I really don't think so). You could also try making list context even more explicit with : my (%config,) = ($conf->getall,); # Now that's overdoing it and see if it changes anything.

      If you can't get any further, try to reduce your program as much as possible until you reach the minimum conditions to reproduce the defect. And tell us on which versions of Perl you work in both cases

        OK, I dumped the $conf object and found the data in there. So what was the matter?

        Well, at one point, being the guy I am who tries to write robust code, I had added

        my $conf = Config::General->new($cfgfile) || die "New config with $cfg +file failed: $!"; my %config = $conf->getall || die "config->getall with $cfgfile faile +d: $!";
        This somehow changed the context of probably the getall call, because when I changed it to
        my $conf = Config::General->new($cfgfile);# || die "New config with $c +fgfile failed: $!"; my %config = $conf->getall;# || die "config->getall with $cfgfile fai +led: $!";
        , it worked perfectly. Thanks for taking me down a proper debugging path.