Модификаторы выражений

Чтобы сделать запись более компактной, после выражения может следовать управляющий модификатор. Например, модификатор if работает по аналогии с блоком if:

print "$n is a negative number.\n" if $n < 0;

Результат получается точно таким же, как при использовании следующего кода (если не считать того, что мы сэкономили на вводе круглых и фигурных скобок):

if ($n < 0) {
print "$n is a negative number.\n";
}

Как мы уже говорили, программисты Perl не любят вводить лишние символы. К тому же более короткая форма хорошо читается на естественном языке: вывести сообщение, если значение $n меньше нуля. Учтите, что условное выражение по-прежнему обрабатывается первым, хотя и записывается в конце. Здесь стандартный порядок обработки слева направо заменяется противоположным порядком. Чтобы понять код Perl, необходимо действовать так, как действует внутренний компилятор Perl, и прочитать команду до конца; только после этого вы поймете, что же в действительности происходит в программе. Существуют и другие модификаторы:

&error("Invalid input") unless &valid($input);
$i *= 2 until $i > $j;
print " ", ($n += 2) while $n < 10;
&greet($_) foreach @person;

Вероятно, вы и сами уже догадались, как они работают.


Каждый моQ
дификатор можно переписать по аналогии с модификатором if из преQ
дыдущего примера. Пример:
while ($n < 10) {
print " ", ($n += 2);
}

Обратите внимание на выражение в круглых скобках в списке аргументов print: оно \ увеличивает $n на 2 и сохраняет результат в $n. Затем новое значение возвращается для вывода командой print. Сокращенные формы читаются почти так же, как фразы на естественном языке: вызвать функцию &greet для каждого элемента @person в списке. Удваивать переменную $i, пока она не станет больше $j. В одном из стандартных способов применения этих модификаторов используются команды следующего вида:

print "fred is '$fred', barney is '$barney'\n" if $I_am_curious;

При подобной «инвертированной» записи наиболее важная часть команды записывается в начале. Главной целью команды является отслеживание значений переменных, а не проверка условия. Некоторые программисты предпочитают записывать всю команду в одну строку, иногда с включением символов табуляции перед if для смещения к правому краю, как в нашем примере; другие размещают модификатор if в отдельной строке:

print "fred is '$fred', barney is '$barney'\n"
if $I_am_curious;

Хотя любое выражение с модификатором можно переписать в виде блока («традиционная» запись), обратное не всегда справедливо.


С каждой стороны модификатора может находиться только одно выражение. Следовательно, вы не можете использовать запись «что-то if что-то while что-то until что-то unless что-то foreach что-то»; все равно получится слишком сложно. Кроме того, несколько команд нельзя разместить слева от модификатора. Если с каждой стороны требуется нечто большее, чем простое выражение, запишите код в «традиционной» форме – с круглыми и фигурными скобками. Как упоминалось ранее в связи с модификатором if, первым всегда вычисляется управляющее выражение (справа), как в традиционной форме. Модификатор foreach не позволяет выбрать другую управляющую переменную – всегда используется переменная $_. Обычно это не создает проблем, но если вы хотите использовать другую переменную, команду придется переписать в виде традиционного цикла foreach.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоинкремент и автодекремент
Значение автоинкремента
Значение ускоренного логического оператора
Логические операторы
Метки блоков