Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Your code suffers a few issues. Here is my code, using a different approach:</p> <pre><code>#!/usr/bin/perl use 5.012; # use strict; use feature 'say'; use warnings; my $number = (int rand 100) + 1; my $max_guesses = 8; GUESS: foreach my $guess_no (1..$max_guesses) { say "($guess_no) Please enter a guess:"; my $guess = &lt;&gt;; chomp $guess; unless ($guess =~ /^\d+$/) { say "Hey, that didn't look like a number!"; redo GUESS; } if ($guess == $number) { say "Congrats, you were on target!"; last GUESS; } elsif ($guess &lt; $number) { say "Nay, your guess was TOO SMALL."; } elsif ($guess &gt; $number) { say "Nay, your guess was TOO BIG."; } else { die "Illegal state"; } if ($guess_no == $max_guesses) { say "However, you have wasted all your guesses. YOU LOOSE."; last GUESS; } } </code></pre> <p>Example usage:</p> <pre><code>$ perl guess-the-number.pl (1) Please enter a guess: 15 Nay, your guess was TOO SMALL. (2) Please enter a guess: 60 Nay, your guess was TOO BIG. (3) Please enter a guess: 45 Nay, your guess was TOO BIG. (4) Please enter a guess: 30 Nay, your guess was TOO SMALL. (5) Please enter a guess: 38 Congrats, you were on target! </code></pre> <p>(all other corner cases (too many guesses, non-numbers as input) work as expected)</p> <p>What did I do differently?</p> <ul> <li>I didn't loop while the guess was too small (← bug!). Instead, I did a loop iteration for each guess. However, a <code>while (1)</code> loop would have worked as well.</li> <li>I did a sanity check on the input, using a simple regular expression. It asserts that the input will be considered numeric by Perl. Else, you get to redo the guess.</li> <li>I initialize all variables as soon as I declare them. This removes any possibilities of uninitialized values popping up in error messages.</li> <li><p>I use proper comparision operators. Perl scalars come in two flavours: stringy and numeric:</p> <pre><code>Stringy Numeric lt &lt; le &lt;= eq == ne != ge &gt;= gt &gt; cmp &lt;=&gt; </code></pre></li> <li>The <code>say</code> function prints the string like <code>print</code>, but appends a newline. This removes akward <code>\n</code>s at the beginning or the end of the string. It makes reading code easier.</li> </ul>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload