Курс языка программирования 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’и — это естественный выбор для шаблонов, сообщений и любого блока текста, который занимает несколько строк.
Навигация по курсу
← Тест — Наречия кавычек | Сырая строка →
💪 Или перейдите сразу к упражнениям этого
раздела.