Помогите разобраться с кодом

Vadik(R)

Well-Known Member
12.12.2007
469
0
#1
Изучаю Perl по саоучителю Клинтона Пирса - Освой Perl за 24 часа. Сегодня был на 4 часу. Объяснялось про массивы. И в качестве применения всего нового изученного, автор дает программу:
Код:
#!/usr/bin/perl -w

@words=qw( Интернет Ответ Принтер Программа );
$guesses[0]="";
$wrong=0;

$choice=$words[rand @words];
$hangman="0-|--<";

@letters=split(//, $choice);
@hangman=split(//, $hangman);
@blankword=(0) x scalar(@hangman);
OUTER:
while ($wrong<@hangman) {
foreach $i (0..$#letters) {
if ($blankword[$i]) {
print $blankword[$i];
} else {
print "-";
}
}
print "\n";
if ($wrong) {
print @hangman[0..$wrong-1]
}
print "\n Ваш выбор: ";
$guess=<STDIN>; chomp $guess;
foreach(@guesses) {
next OUTER if ($_ eq $guess);
}
$guesses[$#guesses]=$guess;
$right=0;
for ($i=0; $i<@letters; $i++) {
if ($letters[$i] eq $guess) {
$blankword[$i]=$guess;
$right=1;
}
}
$wrong++ unless($right);
if (join('', @blankword) eq $choice) {
print "Вы угадали!\n";
exit;
}
}
print "$hangman\n Печально, но было загадано слово $choice.\n";
У меня два вопроса по ней:
1. Почему в строчках 23-25 не нужна точка с запятой после печати (вернее, почему её можно тут не ставить)?
2. Не врублюсь в строчку 39. Автор её описывает просто как: "Переменная $wrong увеличивается на единицу при каждом неправильном ответе пользователя.".
Но из строчки я только понял $wrong++. А что такое unless($right)? И вообще сама конструкция не понятна, там нет if'а.
P.S. Как я врубился, эту строчку можно заменить if (!$right) {$wrong++;};.
 
V

Vovochka

Гость
#2
По пункту 1.
Перед закрытие блока точку с запятой ставить не обязательно.
По пункту 2.
bla_bla_bla unless $bool; действительно имеет такое же значение как и bla_bla_bla if !$bool;