in reply to Re: while loops with two tests not working.
in thread while loops with two tests not working.

Not sure how much code you need but here is the hole scripts. From the testing I have done I know the problem is in the while loop.
#!/user/perl/ use CGI q~:standard~; use CGI::Carp qw(fatalsToBrowser); use strict; use DBI; print "Content-type: text/html\n\n"; my ($dbh, $sth, $filename, @votes, $average, $i); $filename = $ENV{'QUERY_STRING'}; $dbh = DBI -> connect ('dbi:ODBC:', '', '') or die $DBI::errstr; $sth = $dbh -> prepare (qq~select One, Two, Three, Four, Five, TotalVo +tes from FanRatings where Title = ?~) or die $DBI::errstr; $sth -> execute ($filename) or die $DBI::errstr; @votes = $sth -> fetchrow_array; if (defined $votes[0]) { #$average = (($votes[0] + $votes[1] + $votes[2] + $votes[3] + $vot +es[4]) / $votes[5]); $average = 3; $i = 0; while ($i > 0 and $i <= $average) { print qq~<img src="http://www.ffinfo.com/images/misc/starfull. +gif" width="15" height="15" alt="Full Star" style="vertical-align: bo +ttom" /> ~; $i++ } if ($average =~ /\d\.\d/) { print qq~<img src="http://www.ffinfo.com/images/misc/starhalf. +gif" width="15" height="15" alt="Half Full Star" style="vertical-alig +n: bottom" />~; $i = $i + 0.5 } while ($i <= 4) { print qq~<img src="http://www.ffinfo.com/images/misc/starempty +.gif" width="15" height"15" alt="Empty Star" style="vertical-align: b +ottom" /> ~; $i++ } } else { $i = 0; while ($i <= 4) { print qq~<img src="http://www.ffinfo.com/images/misc/starempty +.gif" width="15" height"15" alt="Empty Star" style="vertical-align: b +ottom" /> ~; $i++ } print qq~<br />Be the first to rate this Fan Creation.~; } $dbh -> disconnect();
I will look into switching to a for loop but for my feature info can a while loop handle two tests?

Replies are listed 'Best First'.
Re^3: while loops with two tests not working.
by toolic (Bishop) on Jul 20, 2007 at 00:40 UTC
    I believe it is a logic error.

    The code in the while block does not execute because the while condition is false.

    $average = 3; $i = 0; while ($i > 0 and $i <= $average)
    In order for the while condition to be true, $i must be either 1, 2 or 3. But $i starts at 0.

    Do you really want this?

    while ($i >= 0 and $i <= $average)
      I was about to say "I can't have I start at 1 or be eq to 0 since if average = 0.5 it would not produce a star for me" but then realized I have an if statement later to produce the half star I need. By setting i = 1 everything is working. For some reason I just could not see it in my head until now. Thanks.
Re^3: while loops with two tests not working.
by nedals (Deacon) on Jul 20, 2007 at 00:52 UTC
    Get into the habit of using strict.
    If $i=0, you will never enter the loop which requires $i > 0
    Change to $i >= 0
    my $average = 3; my $i = 0; while ($i >= 0 and $i <= $average) { print qq~<img src=".... /> ~; $i++ }
Re^3: while loops with two tests not working.
by GrandFather (Saint) on Jul 20, 2007 at 00:56 UTC

    Why do you test $i > 0 - it will always fail on the first iteration and you never get another. More likely the logic of what you want is:

    use strict; use warnings; for my $avg (0, 1.3, 1.5, 1.6, 3, 5) { my $average = $avg; my $stars = 0; print "$average: "; while ($stars < int ($average)) { print "*"; ++$stars; } if ($stars <= $average - 0.5) { print "+"; ++$stars; } while ($stars < 5) { print "."; $stars++; } } continue { print "\n"; }

    DWIM is Perl's answer to Gödel