51. Пример использования кросс-оператора X в Perl 6

Сегодня я покажу пример из реальной практики — как использовать кросс-оператор X для создания списка ключевых слов для контекстной рекламы.

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

my $base = q:to/END/;
    окна
    пластиковые окна
    подоконники
    END

my $tags = q:to/END/;
    установка
    замер
    замер и установка
    изготовление
   END

Цитирующая конструкция q:to// здесь очень уместна — она позволяет не загромождать код кавычками. Теперь делим содержимое на отдельные строки и перемножаем результаты:

my @keywords = $base.lines X~ $tags.lines;

Метаоператор X совместно с оператором конкатенации ~ создает последовательность (Seq) строк, составленных из двух частей. Осталось только напечатать результат:

.say for @keywords;

Вот что получается в итоге:

окна установка
окна замер
окна замер и установка
окна изготовление
пластиковые окна установка
пластиковые окна замер
пластиковые окна замер и установка
пластиковые окна изготовление
подоконники установка
подоконники замер
подоконники замер и установка
подоконники изготовление

Таким же образом можно легко добавить третье измерение (например, географию):

my $location = q:to/END/;

   москва
   московская область
  END

my @keywords = $base.lines X~ $tags.lines X~ $location.lines;
.say for @keywords;

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

Обратите внимание на то, что во всех случаях, кроме первого, закрывающая метка END смещена относительно текста на один пробел. Perl 6 удалит из начала строк столько же пробелов, сколько их стоит перед меткой, поэтому получается красиво отформатировать, при этом не добавив лишних пробелов в начало строк.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s