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 я уз­нал, что ро­лей у об­рат­но­го слэ­ша две: ней­тра­ли­зо­вать зна­чение сле­дую­ще­го сим­во­ла или ак­ти­ви­зи­ро­вать его. Кое-что в лю­бом слу­чае ста­ло яс­но. Об­рат­ный слэш сам по се­бе прак­ти­че­­ски ниче­го не оз­на­ча­ет. Поч­ти всегда он свя­зан со сле­дую­щим за ним сим­во­лом.

Ран­ний при­мер об­рат­но­го слэ­ша на кла­виа­ту­ре те­ле­тай­па ASR33. Он не на сво­ем со­вре­мен­ном мес­те, как и боль­шин­ст­во дру­гих зна­ков пунк­туа­ции.

Дру­гой при­мер это­го из­ме­не­ния в по­ве­де­нии я встре­тил в сле­дую­щем ре­гу­ляр­ном вы­ра­же­нии:

$ 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). За­то пря­мой слэш яв­но восхо­дит ко вре­ме­нам Древнего Ри­ма.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию