Курс языка программирования Raku / Продвинутый уровень / Подробнее о встроенных типах / Конструкции кавычек

Heredoc-строки

Heredoc — это форма цитирования для многострочного текста. Вместо разделителей вокруг текста вы указываете слово-терминатор с помощью :to, и строка продолжается от следующей строки до строки, содержащей только это слово:

my $text = q:to/END/;
Hello,
World!
END

print $text;

Это выводит:

Hello,
World!

Терминатор (END в данном случае — подойдёт любое слово) обозначает, где заканчивается текст. Обратите внимание на print: текст сохраняет перевод строки, который стоит перед терминатором, поэтому он уже заканчивается переносом строки — использование say добавило бы второй перенос и оставило бы пустую строку в конце. Поскольку heredoc начинается с q:to, текст не интерполируется; используйте qq:to для интерполяции переменных:

my $name = 'Anna';

my $greeting = qq:to/EOF/;
Dear $name,
Welcome!
EOF

print $greeting;

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

sub greeting {
    return q:to/END/;
        Hello,
        World!
        END
}

print greeting;

Это выводит те же Hello, и World!, что и первый пример. Здесь закрывающий END имеет отступ в восемь пробелов, поэтому восемь пробелов убираются из каждой строки, и возвращаемая строка — просто Hello,\nWorld! без начальных пробелов.

Закрывающий терминатор определяет, сколько удаляется, поэтому каждая строка текста должна иметь отступ не менее этого значения. Если в какой-то строке начальных пробелов меньше, Raku не сможет удалить полный отступ и выдаст предупреждение — Asked to remove 8 spaces, but the shortest indent is 4 spaces. Следите, чтобы терминатор был не глубже самой мелкой строки, чтобы избежать этого. Heredoc’и — это естественный выбор для шаблонов, сообщений и любого блока текста, который занимает несколько строк.

Навигация по курсу

Тест — Наречия кавычек   |   Сырая строка


💪 Или перейдите сразу к упражнениям этого раздела.