Разные операции
В скалярном контексте операция диапазон возвращает булево значение Истина или Ложь. Она работает как переключатель и эмулирует операцию запятая "," пакетного редактора sed и фильтра awk системы Unix, представляющую диапазон обрабатываемых строк этими программами.
Каждая операция диапазон поддерживает свое собственное булево состояние, которое изменяется в процессе ее повторных вычислений по следующей схеме. Она ложна, пока ложным остается значение ее левого операнда. Как только левый операнд становится истинным, операция диапазон переходит в состояние Истина и находится в нем до того момента, как ее правый операнд не станет истинным, после чего операция снова переходит в состояние Ложь. Правый операнд не вычисляется, пока операция находится в состоянии Ложь; левый операнд не вычисляется, пока операция диапазон находится в состоянии Истина.
В состоянии Ложь возвращаемым значением операции является пустая строка, которая трактуется как булева Ложь. В состоянии Истина при повторном вычислении она возвращает следующее порядковое число, отсчет которого начинается с единицы, т. е. как только операция переходит в состояние Истина, она возвращает 1, при последующем вычислении, если она все еще находится в состоянии Истина, возвращается 2 и т. д. В момент, когда операция переходит в состояние Ложь, к ее последнему возвращаемому порядковому числу добавляется строка "ко", которая не влияет на возвращаемое значение, но может быть использована для идентификации последнего элемента в диапазоне вычислений. Программа примера 4.12 и ее вывод, представленный в примере 4.13, иллюстрируют поведение оператора диапазон в скалярном контексте. Мы настоятельно рекомендуем внимательно с ними ознакомиться, чтобы "почувствовать", как работает эта операция.
#! perl – w $left =3; # Операнд1 $right =2; # Операнд2 # Заголовок таблицы print "\$i\tДиапазон\tОперанд1\tОперанд2\n"; print '-' х 48, "\n\n"; # Тест операции for($1=1; $i <= 10; $i++) { $s = $left..$right; print "$i\t $s\t\t $left \t\t $right\n"; $slO = 3 if $i==5; # Когда переменная цикла $i равна 5, # $slO устанавливается равной 3. if ($right==0) {} else {– $right}; # Уменьшение $right на 1, пока # $right не достигла значения 0. – $left; }
Замечание
В целях экономии времени мы не объясняем смысл незнакомых операторов примера 4.12, надеясь, что читатель сможет понять их смысл. Если все же это окажется для него сложным, мы рекомендуем снова вернуться к этой программе после прочтения главы 5.
$1 | Диапазон | Операнд1 | Операнд2 |
---|---|---|---|
1 | 1ЕО | 3 | 2 |
2 | 1ЕО | 2 | 1 |
3 | 1 | 1 | 0 |
4 | 2 | 0 | 0 |
5 | 3 | -1 | 0 |
6 | 4EO | -2 | 2 |
7 | 1EO | -3 | 1 |
8 | 1 | -4 | 0 |
9 | 2 | -5 | 0 |
10 | 3 | -6 | 0 |
Сделаем замечания относительно работы программы примера 4..12. На первом шаге цикла левый операнд операции диапазон истинен, следовательно сама операция находится в состоянии Истина и возвращает первое порядковое число (i). Но правый операнд становится также истинным ($right = 2), следовательно она переходит в состояние Ложь и к возвращаемому ей значению добавляется строка "ЕО". На втором шаге цикла левый операнд истинен ($ieft = 2) и операция переходит в состояние Истина, возвращая значение д, к которому опять добавляется строка "ЕО", так как истинный правый операнд ($ right = 1) переводит операцию в состояние Ложь.