in reply to Re^3: Strange problem with Config::General
in thread Strange problem with Config::General

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.

Replies are listed 'Best First'.
Re^5: Strange problem with Config::General
by Eily (Monsignor) on Nov 18, 2013 at 17:50 UTC

    You nearly always want to use the low precedence or instead of || for this kind of statments. In your case, with precedence being what it is, you actually have : %config = ($conf->getall || die "message");. That probably doesn't look like what you meant.

    With or %config = $conf->getall or die; means (%config = $conf->getall) or die; so getall is called in list context.

    That would still mean that you would die on an empty config (%config = ()). And instead of using or you could just add parenthesis when needed, but I find it clearer when the low precedence operator are used for control flow, and high precedence ones are used when the return value is used.

    NB: your problem is, with a few meaningless differences, one of the exemples given in Logical or and Exclusive Or to show the meaning of both operators.