---

name: Экранирующие последовательности
theory: |

  Мы хотим показать диалог Матери Драконов со своим ребенком:

  ```
  - Are you hungry?
  - Aaaarrrgh!
  ```

  Если вывести на экран строку с таким текстом:

  ```php
  <?php

  print_r("- Are you hungry?- Aaaarrrgh!");
  ```

  то получится так:

  ```
  - Are you hungry?- Aaaarrrgh!
  ```

  Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на энтер» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: `\n`.

  ```php
  <?php

  print_r("- Are you hungry?\n- Aaaarrrgh!");
  ```

  https://replit.com/@hexlet/php-basics-strings-newline

  результат:

  ```
  - Are you hungry?
  - Aaaarrrgh!
  ```

  `\n` — это специальный символ. В литературе его часто обозначают как *LF* (Line Feed). Возможно вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа `\` и `n`, но это не так. С точки зрения компьютера — это один невидимый символ перевода строки. Доказательство:

  ```php
  <?php

  // Мы это не изучали, но вы должны знать правду
  // Ниже код, который возвращает длину строки
  strlen("a");    // 1
  strlen("\n");   // 1 !!!
  strlen("\n\n"); // 2 !!!
  ```

  Почему так сделано? `\n` — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый. Именно поэтому и возникла такая задача. Нужно было как-то представить его на клавиатуре. А поскольку количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений.

  Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter. Во многих редакторах есть опция, позволяющая включить отображение невидимых символов — с её помощью можно понять, где они находятся (хотя это всего лишь схематичное отображение, у этих символов нет графического представления, они невидимые):

  <pre class='hexlet-basics-output'>
  - Привет!¶
  - О, привет!¶
  - Как дела?
  </pre>

  Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

  `\n` — это пример **экранирующей последовательности** (escape sequence). Их ещё называют управляющими конструкциями.  Хотя таких символов не один десяток, в программировании часто встречаются всего несколько подобных символов. Кроме перевода строки, к ним относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать перевод строки `\n` для правильного форматирования текста.

  ```php
  <?php

  print_r("Gregor Clegane\nDunsen\nPolliver\nChiswyck");
  ```

  **Внимание! Экранирующие последовательности вроде `\n` работают только внутри двойных кавычек!**

  На экран выведется:

  <pre class='hexlet-basics-output'>
  Gregor Clegane
  Dunsen
  Polliver
  Chiswyck
  </pre>

  Обратите внимание на следующие моменты:

  1. Не имеет значения, что стоит перед или после `\n`: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.

  2. Помните, что строка может содержать один символ или вообще ноль символов. А ещё строка может содержать только `\n`. Проанализируйте следующий пример:

      ```php
      <?php

      print_r('Gregor Clegane');
      print_r("\n");
      print_r('Dunsen');
      ```

      Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:

      <pre class='hexlet-basics-output'>
      Gregor Clegane
      Dunsen
      </pre>

  3. Если нам понадобится вывести `\n` именно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив ещё один `\` в начале. То есть последовательность `\\n` отобразится как символы `\` и `n`, идущие друг за другом.

  ```php
  <?php

  print_r("Joffrey loves using \\n");
  ```

  на экран выйдет:

  <pre class='hexlet-basics-output'>
  Joffrey loves using \n
  </pre>

  Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется `\r\n`. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность `\r\n` имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине в среде разработчиков принято всегда использовать `\n` без `\r`, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование `\n`.

instructions: |

  Напишите программу, которая выводит на экран:

      - Did Joffrey agree?
      - He did. He also said "I love using \n".

  При этом программа использует только один `print_r()`, но результат на экране должен выглядеть в точности как показано выше.

definitions:
  - name: Экранирующая последовательность
    description: |
      специальная комбинация символов в тексте. Например, `\n` - это перевод строки.

tips:
  - |
    Обязательно поэкспериментируйте с выводом разных строк на сайте [https://repl.it/languages/php](https://repl.it/languages/php)
  - |
    [История перевода строки](https://ru.wikipedia.org/wiki/Перевод_строки#История)
