Модификаторы выражений
В качестве еще одного способа сказать "если это, тогда то" Perl позволяет "прикреплять" к выражению, представляющему собой отдельный оператор, модификатор if.
выражение if удравляющее_выражение;
В данном случае управляющее_выражение
проверяется на истинность (по тем же правилам, что и всегда). Если оно истинно, то вычисляется выражение. Это приблизительно эквивалентно конструкции
if (управляющее_выражение) { выражение;
}
Однако в данном случае дополнительные знаки препинания не нужны, оператор читается справа налево, а выражение должно быть простым (т.е. не может быть блоком операторов). Во многих случаях, однако, такая инвертированная запись оказывается наиболее естественным способом задания условия. Например, вот как можно выйти из цикла при возникновении определенного условия:
LINE: while (<STDIN>) (
last LINE if /"From: /;
}
Видите, насколько проще такая запись? Более того, вы даже можете прочитать ее на нормальном языке: "последняя строка, если она начинается со слова From".
Кроме описанной выше, существуют и другие формы с модификаторами:
выраж2
unless выраж!; # как unless (выражД) ( выраж2; ) выраж2 while выраж!; # как while (выраж!) ( выраж2; } выраж2 until выраж!;
# как until (выраж!) { выраж2; }
Во всех этих формах сначала вычисляется выраж!, а затем в зависимости от результата что-то делается или не делается с выраж2.
Например, вот как можно найти первую по порядку степень числа 2, которая больше заданного числа:
chomp($n = <STDIN>) ;
$i = 1; # исходное предположение $i *= 2 until $i > $n; # вычислять, пока не будет найдена
Как видите, мы опять добиваемся ясности и убираем лишнее. Эти формы нельзя вкладывать одну в другую: нельзя сказать выражЗ while выраж2
if выраж!. Это объясняется тем, что форма выраж2 if выраж! — уже не выражение, а полноценный оператор; после оператора модификатор ставить нельзя.