ripke писал(а): ↑06.04.2010 16:57
Ура, кажется я сделал. Но мне этот код все равно не нравится, хотя он определенно рабочий
Код: Выделить всё
#! /usr/bin/perl -w encoding 'utf8'
$im_thinking_of=int(rand(10));
print "Введите число от 0 до 9:";
$guess=<STDIN>;
while ($guess>$im_thinking_of or $guess<$im_thinking_of or $guess==$im_thinking_of) {
if ($guess<$im_thinking_of) {
print "Недобор\n";
$guess=<STDIN>;
}elsif ($guess>$im_thinking_of) {
print "Перебор\n";
$guess=<STDIN>;
}
last if ($guess==$im_thinking_of) and print "Угадали\n";
}
ок, обратите внимание:
Код: Выделить всё
while ($guess>$im_thinking_of or $guess<$im_thinking_of or $guess==$im_thinking_of) {
описывает любую ситуацию(кроме той когда введено не число, но это пока опустим), поэтому, можно просто while(1){
Вы три раза делаете: $guess=<STDIN>; вместо этого можно просто его внести в цикл:
Код: Выделить всё
while(1){
$guess=<STDIN>;
chomp $guess; # таки нужно отрезать \n
if ($guess<$im_thinking_of) {
print "Недобор\n";
}elsif($guess>$im_thinking_of) {
print "Перебор\n";
}elsif($guess==$im_thinking_of){
print "Угадали\n";
last;
}
}
ripke писал(а): ↑06.04.2010 16:57
По поводу use strict;
Когда я это прописываю, скрипт выдает ошибки
Честно говоря, я не знаю (пока) что такое use strict )), поэтому это не использую.
http://eax.me/perl-basics-part3/ - это страховка от ошибок.
ripke писал(а): ↑06.04.2010 16:57
Еще одно... Вообще-то мне бы хотелось сделать вот так через метку (я почему-то полагал что таким образом я смогу зациклить круг, но похоже, что ошибаюсь).
Можно, не ошибаетесь, но...
НИКОГДА ТАК НЕ ДЕЛАЙТЕ!
ripke писал(а): ↑06.04.2010 16:57
Можете объяснить почему не происходит перехода к метке в этом коде?
Код: Выделить всё
#! /usr/bin/perl -w encoding 'utf8'
#use strict;
$im_thinking_of=5;# (rand(10));
print "Введите часло от 0 до 9:";
$guess=<STDIN>;
#chomp $guess; # Be забудьте удалить символ новой строка!
MYBLOCK: while ($guess>$im_thinking_of) {
print "Перебор\n"; $guess=<STDIN>
}
while ($guess<$im_thinking_of) {
print "Недобор\n"; $guess=<STDIN>
}
if ($guess==$im_thinking_of) {
print "Угадали\n"
} else {
MYBLOCK
}
если как раз таки вставить use strict:
Код: Выделить всё
diesel@indie:~$ cat tmp.pl
#! /usr/bin/perl
use strict;
use warnings;
my $im_thinking_of=5;# (rand(10));
print "Введите часло от 0 до 9:";
my $guess=<STDIN>;
chomp $guess; # Be забудьте удалить символ новой строка!
MYBLOCK: while ($guess>$im_thinking_of) {
print "Перебор\n";
$guess=<STDIN>;
chomp $guess;
}
while ($guess<$im_thinking_of) {
print "Недобор\n";
$guess=<STDIN>;
chomp $guess;
}
if ($guess==$im_thinking_of) {
print "Угадали\n"
} else {
MYBLOCK
}
и запустить, мы узнаем что:
Код: Выделить всё
diesel@indie:~$ ./tmp.pl
Bareword "MYBLOCK" not allowed while "strict subs" in use at ./tmp.pl line 24.
Execution of ./tmp.pl aborted due to compilation errors.
Вобщем, что-то не так. Потому что:
http://en.wikipedia.org/wiki/Perl_control_structures#goto :
if ($guess==$im_thinking_of) {
print "Угадали\n"
} else {
goto MYBLOCK
}