Pull to refresh

Касаемо точек

Reading time 3 min
Views 19K
Original author: Dave Cross
image
В языке perl существует несколько операторов, которые состоят только из точек. Сколько таких операторов вы можете назвать?

Их пять. Обычно perl-программисты могут назвать два или три.

Давайте рассмотрим их по порядку.

Одна точка.



Все знают оператор из одной точки. Это конкатенация, объединение строк. Точнее, это преобразование обоих операндов в строки с их последующим объединением.

my $string = 'one string' . 'another string';
# $string содержит 'one stringanother string'


Иногда полезно бывает принудить один из операндов вернуть результат в скалярном контексте.

say "Time: ", localtime; # возвращает массив значений
say "Time: " . localtime; # возвращает текущую дату и время в виде строки


Небольшая разница между двумя строками кода, зато какая большая разница на выходе.

С одной точкой закончили.

Две точки



С двумя точками уже интереснее. На самом деле, две точки — это два разных оператора. Зависит от того, как вы их используете.

Большинству знаком оператор ".." как оператор, выдающий массив значений из какого-либо промежутка.

my @numbers = (1 .. 100);
my @letters = ('a' .. 'z');


Также его удобно использовать в цикле.

do_something() for 1 .. 30000;


В старых версиях perl для этого создавался временный массив, поэтому такие циклы могли создать большую нагрузку. Сейчас этой проблемы нет.

Итак, в контексте списков две точки — это оператор диапазона. А вот в скалярном — это оператор-переключатель (flip-flop). Называется он так потому, что переключается между двумя значениями, false и true. Начинает с false, при следующем переключении меняется на true, потом снова на false и т.д.

Переключение состояния оператора вызывается вычислением его операндов. Пример.
Допустим, мы обрабатываем текстовый файл вида:

START
тут текст
текст тут
END
ненужный текст
мусор
START
опять нужный текст
текст тут
END

Нужный нам текст заключён между START и END, а остальное — мусор.

Школьный метод обработки обычно таков:

my $process_this = 0;
while (<$file>) {
  $process_this = 1 if /START/;
  $process_this = 0 if /END/;
  process_this_line($_) if $process_this;
}


При использовании оператора ".." эта же программа выглядит так:

while (<$file>) {
  process_this_line($_) if /START/ .. /END/;
}


Оператор-переключатель возвращает false, пока левый операнд (/START/) не вернёт true. Тогда переключатель переключается в true, и возвращает его до тех пор, пока правый операнд (/END/) не вернёт true. Тогда происходит переключение в false, и цикл повторяется.

Ещё один трюк. Допустим, нам нужно обработать только с 20-й по 40-ю строчки файла. Текущий номер прочитанной строки из последнего открытого файла содержится в специальной переменной $.
Если операнды переключателя — константы, он сравнивает их с содержимым $., и переключается, когда номер строки совпадает. Поэтому обработать с 20 по 40 строки файла очень просто:

while (<$file>) {
  process_this_line($_) if 20 .. 40;
}


Три точки



Оператор из трёх точек называется yada-yada (по-русски, наверно, «бла-бла»), и был добавлен в perl 5.12
Строго говоря, наверно это директива языка, а не оператор, так как операндов у него нет.
Предназначена она для замены ещё не написанного кода.

sub reverse_polarity {
  # TODO: Тут будет обалденный код
  ...
}


Такого рода пометки программисты делают в коде уже давно. И традиционно троеточие подразумевает нечто ещё не написанное. Но теперь эти три точки можно реально вписать в код, и он будет компилиться и работать.
Смысл в том, что если вы просто оставите пустую функцию, она будет молча отрабатывать и ничего не возвращать. А троеточие в коде приведёт к тому, что perl выдаст специальное предупреждение «Unimplemented at _file_ line ##». Такая вот напоминалочка.

Но на самом деле, в perl с давних времён есть другой оператор в виде троеточия. Это другая версия оператора-переключателя flip-flop.

Оператор-переключатель из двух точек сначала вычисляет значение левого операнда, если true — переключается, и потом сразу вычисляет значение правого. И если оно тоже true, он сразу переключается обратно. Оператор же из трёх точек не проверяет сразу значение правого операнда, таким образом гарантируя минимум одно выполнение.

Конечно, выглядит это ненужным усложнением, но возможно в некоторых случаях может пригодиться и такое поведение. Но судя по тому, что очень мало людей знает об операторе flip-flop из трёх точек, он мало когда нужен.

Итак, вот они, 5 операторов: конкатенация, диапазон, flip-flop, бла-бла и ещё один flip-flop.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+49
Comments 22
Comments Comments 22

Articles