我是 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/