Более простой подход не будет while
loop.
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;
}
}
While (каламбур) код уже очень хорошо (вы используете strict
и warnings
и нет никаких синтаксических ошибок, яй для этого!) Есть некоторые вещи, которые я изменилась, и еще некоторые, где я бы предполагают улучшение.
Но сначала посмотрим на цикл. Программа останется в цикле while
, пока условие истинно. Поскольку все, что пользователь может ввести (даже пустую строку), считается Perl истинным, это навсегда. Это нормально, так как есть условие выхода из цикла. Он находится в else
части if
. Оператор last
указывает Perl выйти из цикла. Если else
не выполнен, он вернется к началу блока while
, и пользователь должен повторить попытку. Навсегда.
Изменения, которые я сделал: - Вам не нужно $i
как вы не использовали его - Вы использовали три отдельных if
заявления. Так как только один из трех условий может быть верно в данном случае, я слил их в один - Нет необходимости для скобок ()
с print
Предложения: - Вы должны назвать ваши переменные для того, что они делают, а не то, что они находятся. $int
- нехорошее имя. Я бы пошел с $random
, или даже $random_number
. Многословность важна, если вам нужно вернуться к вашему коду в более позднем пункте. - Существует function called say
, который вы можете включить с помощью use feature 'say';
. Он добавляет say "stuff"
в качестве эквивалента print "stuff\n"
.
Edit:
Если вы хотите добавить другие условия, которые непосредственно не относятся к числу которых пользователь вошел, вы можете добавить еще 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//
- match operator, который работает вместе с =~
. \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;
}
# ...
}
Таким образом, полная проверка означает "взгляд на вещи пользователь вошел, и если есть что-нибудь еще, чем число в нем вообще, жаловаться, и пусть он снова попробовать.
У вас нет петли, хотя вы, похоже, знаете, что вам нужен цикл. Что именно вы хотите знать? Синтаксис циклов? – Ingo
Я собираюсь опробовать цикл до конца и посмотреть, что мне нужно. Наверное, это так. – joesh
Недавно я представил полнофункциональную реализацию «угадать мой номер» на [codereview] (http://codereview.stackexchange.com/a/23556/21609). Возможно, вам захочется посмотреть на вдохновение. – amon