更直接的方法是while
循环。
use strict;
use warnings;
print "Hello, I've thought of a number, do you know what number it is?\n";
sleep (1);
my $int = int(rand (10)) + 1;
print "Try and guess, type in a number between 1 and 10!\n";
while (my $div = <STDIN>) {
chomp $div;
if ($div < $int) {
print "The number I though of is higher than $div, try again?\n";
}
elsif ($div > $int) {
print "The number I though of is lower that $div, try again?\n";
}
else {
print "Amazing, you've guessed mt number\n";
last;
}
}
虽然(双关语)你的代码已经非常好(你正在使用strict
并且warnings
没有语法错误,是的!)我改变了一些东西,还有一些我建议改进的地方。
但首先,让我们看一下循环。while
只要条件为真,程序就会一直停留在循环中。由于 Perl 认为用户可以输入的所有内容(甚至是空行)都是正确的,所以这是永远的。这很好,因为有退出循环的条件。它else
在if
. 该last
语句告诉 Perl 退出循环。如果else
没有执行,它将回到while
块的开头,用户必须重试。永远。
我所做的更改:-您不需要$i
,因为您没有使用它-您使用了三个单独if
的语句。()
由于在这种情况下只有三个条件中的一个可以为真,我将它们合并为一个 - 不需要括号print
建议: - 您应该为变量命名它们的作用,而不是它们是什么。$int
不是一个好名字。我会去$random
,甚至$random_number
。如果您稍后必须返回您的代码,那么详细程度很重要。- 有一个名为的功能say
,您可以使用use feature 'say';
. 它say "stuff"
相当于print "stuff\n"
.
编辑:
如果您想添加与用户输入的号码没有直接关系的其他条件,您可以添加另一个if
.
while (my $div = <STDIN>) {
chomp $div;
if ($div eq 'quit') {
print "You're a sissy... the number was $int. Goodbye.\n";
last;
}
if ($div < $int) {
print "The number I though of is higher than $div, try again?\n";
}
elsif ($div > $int) {
print "The number I though of is lower that $div, try again?\n";
}
else {
print "Amazing, you've guessed mt number\n";
last;
}
}
您还可以添加检查以确保用户输入了一个数字。如果输入了单词或字母,您当前的代码将产生警告。为此,您将需要一个正则表达式。在perlre中阅读它们。m//
是与一起使用的匹配运算符=~
。\D
匹配任何不是数字(0 到 9)的字符。next
跨过块的其余部分while
并开始检查while
条件。
while (my $div = <STDIN>) {
chomp $div;
if ($div =~ m/\D/) {
print "You may only guess numbers. Please try again.\n";
next;
}
# ...
}
因此,完整的检查意味着“查看用户输入的内容,如果里面除了数字之外还有其他内容,请投诉并让他再试一次”。