perl - 在 Perl 的 numeric lt (<) line 25 中使用未初始化值 $guess

标签 perl random

我是 Perl 的新手,分配给了我一个简单的猜谜游戏,用户有 8 次机会猜出 1 到 100 之间的数字。我一直收到上述错误并且无法弄清楚.

这是我的代码:

    use Modern::Perl;

    my ($guess,$target,$counter); 
    $target = (int rand 100) + 1;

    while ($guess < $target)
    {
        chomp ($guess=<>);
        print "Enter guess $counter: ";

        $counter++;

        if ($guess eq $target) {
            print "\nCongratulations! You guessed the secret number $target in   $counter";
        }
        elsif ($guess > $target) {
            print "\nYour guess, $guess, is too high.";
        }
        elsif ($guess < $target) {
            print "\nYour guess, $guess, is too low.";
        }
        else {
            print "You lose. The number was $target.";
        }
    }

最佳答案

您的代码存在一些问题。这是我的代码,使用了不同的方法:

#!/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 = <>;
  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 < $number) {
    say "Nay, your guess was TOO SMALL.";
  } elsif ($guess > $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;
  }
}

示例用法:

$ 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!

(所有其他极端情况(太多猜测,非数字作为输入)按预期工作)

我做了哪些不同的事情?

  • 当猜测太小时我没有循环(←错误!)。相反,我对每个猜测都进行了循环迭代。但是,while (1) 循环也可以正常工作。
  • 我使用简单的正则表达式对输入进行了完整性检查。它断言输入将被 Perl 视为数字。否则,您需要重做猜测。
  • 我在声明变量后立即初始化所有变量。这消除了错误消息中弹出未初始化值的任何可能性。
  • 我使用适当的比较运算符。 Perl 标量有两种形式:字符串和数字:

    Stringy  Numeric
    lt       <
    le       <=
    eq       ==
    ne       !=
    ge       >=
    gt       >
    cmp      <=>
    
  • say 函数像print 一样打印字符串,但会附加一个换行符。这会删除字符串开头或结尾处的 akward \n。它使阅读代码更加容易。

关于perl - 在 Perl 的 numeric lt (<) line 25 中使用未初始化值 $guess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13596417/

相关文章:

perl - 使用子程序时出现错误 "variable will not stay shared"

perl - 在递归 ssh 命令中引用 bash 和 perl

perl - 如何编写CGI脚本以通过ssh执行远程脚本并显示来自远程执行的数据?

python - 为什么perl,ruby使用/dev/urandom

c++ - 英特尔 MKL 一次可以生成多少个随机数?似乎超出了一些限制

perl - 在perl中复制内部系统命令

mysql - 获取MYSQL随机行的最快方法

ruby-on-rails - Ruby 从数组中随机选择有时会重复返回相同的值

Python:如何在随机多项选择中跟踪 "correct"答案

c++ - 如何为 GSL(GNU 科学图书馆)改编 C++ 风格的随机数引擎?