- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF142:DrBrown2
Материал из Linuxformat.
Прикрыться экраном
- Интервью с метасимволами № 3: обратный слэш.
До начала своих изысканий я воображал, что привычное амплуа обратного слэша – быть экранирующим символом. В конце концов, он выполняет именно эту функцию в оболочке, в регулярных выражениях, в Awk и Perl и во многих других случаях. Однако оказалось, что на этом его жизнь не заканчивается.
Начнем с очевидных задач этого символа. С первыми двумя обратными слэшами я повстречался в простой команде оболочки:
$ cp January\ Sales\ Figures ~/summaries
«Мы обычные экранирующие символы, – объяснили они. – Мы нейтрализуем магическое значение пробелов, и они становятся просто частью имени файла. Без нас оболочка посчитала бы, что здесь три отдельных аргумента».
Следующий пример скрывался в самом конце длинной строки, как непослушный ребенок, которого поставили в угол:
$ slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 -s \ “cn={12}kerberos,cn=schema,cn=config” > /tmp/cn=kerberos.ldif
«Я символ продолжения строки, – похвастался он. – Благодаря мне команда может длиться несколько строк». Жаль прокалывать его мыльный пузырь, но… он – все тот же символ экранирования, нейтрализующий действие следующего за ним символа перевода строки, точно так же, как в предыдущем примере было с пробелами.
Следующий пример неожиданно появился в классической программе Hello World. Это пример на C, но почти во всех остальных языках он будет выглядеть примерно так же:
printf(“Hello World!\n”);
Я пытался поговорить с обратным слэшем наедине, но он настоял на присутствии n. «Мы escape-последовательность, – сказали оба хором. – Мы представляем символ новой строки». Существуют и другие: \t – символ табуляции, а \a — символ сигнала или звонка. (Кстати, кто-нибудь помнит те времена, когда в телетайпах был настоящий колокольчик, звонивший при приеме символа с ASCII-кодом 007? Сегодня ваш терминал скорее всего лишь походя пискнет.) Также есть последовательность \\, которая соответствует одиночному обратному слэшу и иллюстрирует загон самого себя в синтаксический угол.
Впрочем, вернемся к нашей теме. Из беседы с \n я узнал, что ролей у обратного слэша две: нейтрализовать значение следующего символа или активизировать его. Кое-что в любом случае стало ясно. Обратный слэш сам по себе практически ничего не означает. Почти всегда он связан со следующим за ним символом.
Другой пример этого изменения в поведении я встретил в следующем регулярном выражении:
$ grep ‘\<ram\>’ literature.txt
Здесь, по словам обратных слэшей, они активизируют специальное значение символов < и > – «начало слова» и «конец слова» соответственно. Таким образом, этому регулярному выражению соответствуют строки, содержащие отдельное слово ram, а не “program” или “ramble”.
Регулярные выражения открывают для обратных слэшей большие возможности. Взгляните на этот пример:
$ grep ‘^\([a-z]\)\([a-z]\)[a-z]\2\1$’ /usr/share/dict/words
Здесь первые четыре слэша активируют круглые скобки, ( и ), обрамляющие части регулярного выражения. Два последних обратных слэша создают обратные ссылки, так что \n отвечает тому, чему соответствует n-я сгруппированная часть регулярного выражения. Данный пример находит палиндромы из пяти букв, такие как “level ” и “solos”.
Сложные рокировки
А теперь – о действительно хитрых штуках. В базовых регулярных выражениях, как в предыдущем примере, сама скобка ( означает собственно скобку, а \( производит группировку. А в расширенных регулярных выражениях сама скобка ( производит группировку, а \( означает собственно скобку. Если вас это не смущает, то вы не понимаете, что происходит!
Итак, существуют «деактиваторы» и «активаторы». Но каждый попавшийся мне обратный слэш был прикреплен к следующему за ним другому символу. Одиночек я не встречал.
Наконец я забрел в клуб в сомнительной части города, где обнаружил обратных слэшей, которые работали сами по себе. Сгорбившись за стойкой бара, они топили свою печаль в синтаксическом сахаре. Разговорить их было нелегко, но один в результате раскололся. «У нас была благородная работа, – всхлипнул он, – ввод тэгов разметки в Tex. Но нас сократили. Мы пытались найти работу в URL-адресах и разметке HTML и XML, но всё самое лучшее забрали прямые слэши. Теперь мы просто разделители. Работаем на М Большое».
В самом темном углу бара сидел особо мрачный субъект – он нанялся в Visual Basic оператором целочисленного деления. Впрочем, не судите его слишком строго. Всем надо как-то зарабатывать на жизнь.
Откуда он, обратный слэш?
Обратный слэш – один из тех символов, которые попадаются в компьютерном коде, но не в письменном английском языке. Это сравнительно новый пацан в нашем дворе. В набор компьютерных символов – в частности, в ASCII – его (вместе с круглыми скобками) добавил покойный Боб Бемер [Bob Bemer] в 1961 году (см. http://www.bobbemer.com/BAC-SLASH.HTM). Зато прямой слэш явно восходит ко временам Древнего Рима.