PaulB-Liverpool has asked for the wisdom of the Perl Monks concerning the following question:

Hi. New poster here! I'm building a Cricket Sports Database. The code below runs fine until it gets past batters who have scored runs, (returns 236 records) but when it hits bowlers with no runs (blank Field), I get Division by Zero error. I've tried allsorts of solutions ... mainly from here; but I'm a bit new and can't figure it out... It's a flat file system DBMan from years ago; but still great if working!! I've truncated the table for easier viewing...

sub html_record { # -------------------------------------------------------- my (%rec) = @_; # Load any defaults to put in the VALUE field. $total = 0; $total = $rec{'BatterRuns'} + $rec{'HighestScore'}; $baverage1 = 0; $baverage1 = $rec{'Innings'} - $rec{'NotOut'}; $baverage = 0; $baverage = $rec{'BatterRuns'} / $baverage1; # Gives 236 correct results until it hits a blank bowler field # who has not batted ie: NULL</b> ($db_auto_generate and print &build_html_record(%rec) and return); print qq| <TABLE WIDTH="450" CELLPADDING=0 CELLSPACING=0 BORDER=1 BGCOLOR="#FFFF +CC"> <TR><TD ALIGN="Right" VALIGN="TOP"><$font_color>Batting Average:</FONT +></TD><TD>&nbsp;<$font>$baverage</Font></TD></TR> </TABLE> |; }

Replies are listed 'Best First'.
Re: Null values in Perl Calculation
by tybalt89 (Monsignor) on May 02, 2024 at 23:50 UTC

    Try changing

    $baverage = $rec{'BatterRuns'} / $baverage1;

    to

    $baverage1 and $baverage = $rec{'BatterRuns'} / $baverage1;

    This should only do the divide when $baverage1 is non-zero (i.e. true).

Re: Null values in Perl Calculation
by syphilis (Archbishop) on May 03, 2024 at 00:44 UTC
    ... but when it hits bowlers with no runs (blank Field), I get Division by Zero error

    I think you've misdiagnosed the problem.
    The error will occur when and only when $rec{'Innings'} == $rec{'NotOut'} - ie for cricketers who have never been dismissed, irrespective of how many runs they've made.

    Cheers,
    Rob
Re: Null values in Perl Calculation
by hippo (Archbishop) on May 03, 2024 at 07:49 UTC

    Welcome to the Monastery, PaulB-Liverpool.

    In addition to the good replies you have already received, I will suggest that $baverage1 is not a great name for that variable. It seems to contain the number of dismissals and not an average of any kind whatsoever. Perhaps $dismissals or even the concise $outs would be better.

    And, in case you were unaware, you do not need all those single quotes inside the hash keys.


    🦛

Re: Null values in Perl Calculation
by BillKSmith (Monsignor) on May 03, 2024 at 15:20 UTC
    Syphilis has identified a special case where this average does not exist. tybalt89 proposed a solution which avoids the error by bypassing the calculation. With this correction, your existing code would output a numeric zero. This may be a problem for your users because they could not tell the difference between an average of zero and no average. I recommend that you ask them what they would prefer. Other possible choices include:
    • Omit record
    • Output a null string
    • Ouput a string of blanks
    • Output a special string ('*****' or '-----')
    Except for the first, you could use
    $baverage = $baverage1 ? $rec{'BatterRuns'} / $baverage1 : '*****';
    Bill
Re: Null values in Perl Calculation
by PaulB-Liverpool (Initiate) on May 04, 2024 at 01:16 UTC
    Thanks all; particularly tybalt89 who solved my logic problem! And yes, variables have been renamed as suggested. I'm a starter; big style! I managed to sort out making the average readable to 2 decimals om my own (it took a while). I like it here... it's like the internet used to be! Thanks.