hesco has asked for the wisdom of the Perl Monks concerning the following question:

I'm getting an error I've been unable to shake for the past couple of hours. It reads:

The count of critical failures is 0. Count of critical failures: 0 Use of uninitialized value in numeric eq (==) at lib/Test/MonitorSites +.pm line 183.
And the code that generates it reads:

my $critical_failures = $self->_analyze_test_logs(); print STDERR "Count of critical failures: $critical_failures->{'coun +t'}\n"; if($critical_failures->{'count'} != '0'){ # line 183 $self->sms($critical_failures); } elsif ($self->{'config'}->param('global.report_success') == 1) { $self->sms($critical_failures); } else { $self->{'error'} .= "We won't send an sms, there were no critical_ +failures and global.report_success is not set true.\n"; } . . . sub _analyze_test_logs { my $self = shift; my $critical_failures = 0; my %critical_failures; $critical_failures{'count'} = 0; . . . $critical_failures{'count'} = $critical_failures; if($critical_failures{'count'} == 0){ print STDERR "The count of critical failures is 0.\n"; } return \%critical_failures; }
I've quoted and unquoted the zero on line 183, without effect. I've tried, actually started, using the '>' operator instead of '!='. But I'm stumped here. Any ideas why zero would not be equal to zero, or why a variable defined on one line would be reported as uninitialized on the very next line?

UPDATE

Ikegami: you're good. I had in fact emitted an elsif clause in my efforts to simplify the situation. I have now restored that clause to the code above with this update. Now I'll go add some debugging statements to try to track down what I now suspect may be a missing configuration paramater. I'll report back on what I learn in a few minutes.

UPDATE #2

Ikegami: That was it. I just added a patch to my constructor which defines the $self->{'config'}->param('global.report_success') value if its missing. Thanks again! I think that just might make this ready the release of a new version.

-- Hugh

if( $lal && $lol ) { $life++; }

Replies are listed 'Best First'.
Re: Defined values errors out as unitialized
by ikegami (Patriarch) on Mar 21, 2007 at 22:57 UTC

    Does the if on line 183 have an elsif? Runtime warnings and errors from the elsif condition expression would appear to be from line 183.

    I'm not getting any warnings from the code you posted, nor do I expect to get any.

    use strict; use warnings; my $self = bless({}); my $critical_failures = $self->_analyze_test_logs(); print STDERR "Count of critical failures: $critical_failures->{'coun +t'}\n"; if($critical_failures->{'count'} != 0){ print("!= 0\n"); } else { print("== 0\n"); } sub _analyze_test_logs { my $self = shift; my $critical_failures = 0; my %critical_failures; $critical_failures{'count'} = 0; $critical_failures{'count'} = $critical_failures; if($critical_failures{'count'} == 0){ print STDERR "The count of critical failures is 0.\n"; } return \%critical_failures; }
    The count of critical failures is 0. Count of critical failures: 0 == 0
Re: Defined values errors out as unitialized
by GrandFather (Saint) on Mar 21, 2007 at 22:55 UTC

    I suggest you crunch your sample code down to a simple runnable test case that demonstrates the error. Something like the following (which does not reproduce the error):

    use strict; use warnings; my $critical_failures = _analyze_test_logs (); print STDERR "Count of critical failures: $critical_failures->{count}\ +n"; if($critical_failures->{count} != 0){ # line 183 print "Condition true" } else { print "Condition false" } sub _analyze_test_logs { my $critical_failures = 0; my %critical_failures; $critical_failures{count} = 0; $critical_failures{count} = $critical_failures; if($critical_failures{count} == 0){ print STDERR "The count of critical failures is 0.\n"; } return \%critical_failures; }

    Prints:

    The count of critical failures is 0. Condition false Count of critical failures: 0

    Update:

    There are a few foibles in your code. $critical_failures->{count} != 0 is probably better written as $critical_failures->{'count'} != '0'. In particular the != is numerical but '0' is a string - how do you really want to compare it, as a number or as a string?

    Using the same identifier for both a scalar and a hash in the same scope leads to confusion at best, and near impossible to track bugs at worst. I'd be inclined to change $critical_failures to $critical_failure_count.


    DWIM is Perl's answer to Gödel