Оператор if/unless
Следующей по сложности управляющей структурой является оператор if. Эта конструкция состоит из управляющего выражения (проверяемого на истинность) и блока. В ней также может быть часть, начинающаяся оператором else, за которой следует еще один блок операторов. Другими словами, все это выглядит так:
if (выражение) (
оператор_1
оператор_2
оператор_3 }
else {
оператор_1
оператор_2
оператор_3 }
(Если вы любите программировать на С и Java, то для вас должна быть вполне очевидной обязательность фигурных скобок. Они устраняют необходимость в применении правила "путающего зависшего else".)
Во время выполнения Perl-программы вычисляется управляющее выражение. Если оно истинно, то выполняется первый блок операторов в приведенном выше примере. Если выражение ложно, то выполняется второй блок.
Что же такое "истина" и "ложь"? В Perl эти правила несколько странноваты, но, тем не менее, дают ожидаемые результаты. Управляющее выражение вычисляется как строковая
величина в скалярном контексте (если это уже строка, ничего не изменяется, а если это число, то оно преобразуется в строку*). Если данная строка либо пуста (т.е. имеет нулевую длину), либо состоит из одного символа "О" (цифры нуль), то значение выражения — "ложь". Все остальное автоматически дает значение "истина". Почему же в Perl столь забавные правила? А потому, что это облегчает условный переход не только по нулю (в противоположность ненулевому числу), но и по пустой (в противоположность непустой) строке, причем без необходимости создания двух версий интерпретируемых значений "истина" и "ложь". Вот несколько примеров интерпретации этих значений.
О # преобразуется в "О", поэтому "ложь"
1-1 # дает в результате 0, затем преобразуется в "О", поэтому "ложь"
1 # преобразуется в "I", поэтому "истина"
"" # пустая строка, поэтому "ложь"
"1" # не "" или "О", поэтому "истина"
"00" # не "" или "О", поэтому "истина" (это странно, поэтому будьте настороже)
"0.000" # "истина" — будьте внимательны, по той же причине
undef # дает в результате "", поэтому "ложь"
* Внутренне все трактуется несколько иначе, но внешне все выполняется так, будто именно это и происходит.
Таким образом, интерпретация значений как истинных или ложных достаточно интуитивна, но пусть это вас не пугает. Вот пример полного оператора if:
print "how old are you? ";
$a = <STDIN>;
chomp($a) ;
if ($a < 18) (
print "So, you're not old enough to vote, eh?\n";
( else (
print "Old enough! Cool! So go vote! \n";
$voter++; # count the voters for later )
Блок else можно опустить, оставив только часть, касающуюся then:
print "how old are you? ";
$a - <STDIN>;
chomp($a) ;
if ($a < 18) (
print "So, you're not old enough to vote, eh?\n";
}
Иногда бывает удобно часть "then" опустить и оставить только else, потому что более естественно сказать "сделайте то, если это ложь", нежели "сделайте то, если это — не истина". В Perl этот вопрос решается с помощью оператора unless:
print "how old are you? ";
$a = <STDIN>;
chomp ($a) ;
unless ($a < 18) (
print "Old enough! Cool! So go vote!\n";
$voter++;
>
Заменить if на unless — это все равно что сказать "Если управляющее выражение ложно, сделать..." (Оператор unless может содержать блок else, как и оператор if.)
Если у вас больше двух возможных вариантов, введите в оператор if ветвь elsif, например:
if (выражение один) {
оператор_1_при_истине_ один;
оператор_2 _при_истине_один;
оператор_ 3_при_истине_ один ;
} elsif (выражение_два) {
оператор_1_при_истине_два
оператор_2_при_истине_два
олератор_3_при_истине_два }
elsif (варажение_три) (
оператор_1_при_истине_три
оператор_2_при_истине_три
оператор _ 3_при_истине_ три
} else ( -
оператор__ 1_при_всеи_ложных;
оператор_2_при_в
сех_ложных/ оператор_3_при_всех_ложных;
}
Все управляющие выражения вычисляются по очереди. Если какое-либо выражение истинно, то выполняется соответствующая ветвь, а все остальные управляющие выражения и соответствующие блоки операторов пропускаются. Если все выражения ложны, то выполняется ветвь else (если таковая имеется). Присутствие блока else не обязательно, но он никогда не помешает. В программе может быть столько ветвей elsif, сколько вам необходимо.