より直接的なアプローチは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;
}
}
(しゃれを意図した) あなたのコードはすでに非常に優れています (あなたは and を使用してstrict
おりwarnings
、構文エラーはありません!) 私が変更した点と、改善を提案したい点がいくつかあります。
しかし、最初に、ループを見てみましょう。while
条件が真である限り、プログラムはループにとどまります。ユーザーが入力できるものはすべて (空行であっても) Perl によって true と見なされるため、これは永遠に続きます。ループを終了する条件があるため、これは問題ありません。のelse
部分にありif
ます。このlast
ステートメントは、Perl にループを終了するように指示します。が実行されない場合、ブロックelse
の先頭に戻り、ユーザーは再試行する必要があります。while
永遠に。
$i
私が行った変更: -使用していないので必要ありません- 3 つの別々のif
ステートメントを使用しました。この場合、3 つの条件のうち 1 つだけが true になる可能性があるため、それらを 1 つにマージしました()
。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//
、と一緒に機能する一致演算子=~
です。は、数字 (0 ~ 9) 以外の\D
任意の文字に一致します。next
ブロックの残りをステップオーバーしwhile
、条件のチェックから開始しwhile
ます。
while (my $div = <STDIN>) {
chomp $div;
if ($div =~ m/\D/) {
print "You may only guess numbers. Please try again.\n";
next;
}
# ...
}
したがって、完全なチェックとは、「ユーザーが入力したものを見て、数字以外のものが含まれている場合は、文句を言って再試行させる」ことを意味します。