Курс 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-и є природним вибором для шаблонів, повідомлень і будь-якого блоку тексту, що займає кілька рядків.

Навігація курсом

Тест — Адверби квотування   |   Сирий рядок


💪 Або перейдіть одразу до вправ цього розділу.