in reply to while loops with two tests not working.

You haven't given us enough code to see where your problem is, but I'd suggest that you use strictures (use strict; use warnings;) and use a Perl for loop rather than the while loop:

use strict; use warnings; my $average = 3; for my $i (1 .. $average) { print qq~dibbly\n~; }

Prints:

dibbly dibbly dibbly

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: while loops with two tests not working.
by Eagle_f90 (Acolyte) on Jul 20, 2007 at 00:31 UTC
    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?
      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.
      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++ }

      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