В вычислении , а здесь документ ( документ-здесь , здесь-текст , Heredoc , hereis , здесь струны или здесь-скрипт ) представляет собой файл буквальный или входной поток буквальный: это сечение исходного код файл , который рассматривается , как если бы это был отдельный файл . Этот термин также используется для формы многострочных строковых литералов, которые используют аналогичный синтаксис, сохраняя разрывы строк и другие пробелы (включая отступы) в тексте.
Здесь документы происходят из оболочки Unix , [1] и находятся , среди прочего, в оболочке Bourne ( sh
), оболочке C ( csh
), [2] tcsh ( tcsh
), [3] KornShell ( ksh
), Bash и оболочке Z ( zsh
). . Здесь строковые литералы в стиле документа встречаются в различных языках высокого уровня , в частности в языке программирования Perl (синтаксис вдохновлен оболочкой Unix) и языках, на которые влияет Perl, таких как PHP и Ruby . Другие языки высокого уровня, такие как Python ,В JavaScript и Tcl есть другие возможности для многострочных строк.
Здесь документы можно рассматривать как файлы или строки. Некоторые оболочки рассматривают их как строковый литерал формата , позволяя заменять переменные и команды внутри литерала.
За наиболее распространенным синтаксисом для здесь документов, созданных в оболочках Unix, <<
следует ограничивающий идентификатор (часто слово EOF или END [4] ), за которым, начиная со следующей строки, помещается текст, который нужно заключить в кавычки, а затем закрывается тот же идентификатор-разделитель в отдельной строке. Этот синтаксис , потому что здесь документы формально поток литералов, а содержание документа перенаправляются на стандартный ввод (стандартный ввод) из предыдущей команды; Синтаксис здесь документа аналогичен синтаксису перенаправления ввода , который <
«принимает ввод из следующего файла».
Другие языки часто используют практически аналогичный синтаксис, но детали синтаксиса и фактические функции могут значительно отличаться. Когда используется просто для строковых литералов, <<
он не указывает на косвенное обращение, а является просто условным обозначением начального разделителя. В некоторых языках, таких как Ruby, <<
также используется для перенаправления ввода, что приводит к <<
двойному использованию, если кто-то хочет перенаправить из строкового литерала здесь документа.
Файловые литералы
В узком смысле, здесь документы - это файловые литералы или потоковые литералы. Они происходят из оболочки Unix, хотя аналогичные средства доступны на некоторых других языках.
Оболочки Unix
Здесь документы доступны во многих оболочках Unix. [1] В следующем примере текст передается tr
команде (транслитерируя нижний регистр в верхний регистр) с использованием документа здесь. Это может быть файл оболочки или вводиться интерактивно по запросу.
$ LANG = C tr az AZ << КОНЕЦ > раз два три > четыре пять шесть > КОНЕЦ ПЕРВЫЙ ДВА ТРИ ЧЕТЫРЕ ПЯТЬ ШЕСТЬ
END
использовался как ограничивающий идентификатор. Он определяет начало и конец этого документа. Идентификатор перенаправления и ограничивающий идентификатор не нужно разделять пробелом: <
<< END
оба работают одинаково хорошо.
По умолчанию поведение во многом идентично содержимому двойных кавычек: имена переменных заменяются их значениями, команды в обратных кавычках оцениваются и т. Д. [A]
$ cat << EOF > \ $ Рабочий каталог "$ PWD" `pwd` > EOF $ Рабочий каталог " / home / user " / home / user
Это можно отключить, заключив в кавычки любую часть метки, которая затем заканчивается значением без кавычек; [b] поведение по существу идентично тому, если бы содержимое было заключено в одинарные кавычки. Так, например, заключив его в одинарные кавычки:
$ cat << 'EOF' > \ $ Рабочий каталог "$ PWD" `pwd` > EOF \ $ Рабочий каталог" $ PWD "` pwd`
Также могут использоваться двойные кавычки, но это может вызвать путаницу, потому что раскрытие действительно происходит в строке с двойными кавычками , но не встречается в документе с двойными кавычками с разделителем. [5] Разделители в одинарных и двойных кавычках различаются в некоторых других языках, особенно в Perl (см. Ниже), где поведение аналогично соответствующим строковым кавычкам.
В оболочке POSIX, но не csh / tcsh, добавление знака «минус» к <<
(т.е. <<-
) приводит к игнорированию ведущих вкладок. [3] Это позволяет размещать здесь документы в сценариях оболочки (в первую очередь для выравнивания с существующим отступом) без изменения их значения: [c]
Скрипт, содержащий:
LANG = C tr az AZ << - END_TEXT Здесь doc с << - Один пробел (например, 0x20) находится в начале этой строки Эта строка начинается с одного символа TAB, то есть 0x09, как и следующая строка END_TEXTecho Предполагаемый конец был до этой строки echo, и они не были обработаны tr echo +++++++++++++++LANG = C tr az AZ << END_TEXT Здесь doc с << Один пробел (например, 0x20) находится в начале этой строки Эта строка начинается с одного символа TAB, то есть 0x09, как и следующая строка END_TEXTЭхо Желаемого конца был до этой линии, эхо , но так как линия с ограничивающей Identifier началась с TAB он не был распознан и эхо КОНЦЕРНА команда продолжала обработку.
производит:
ЗДЕСЬ ДОКУМЕНТ << - ОДИНОЧНЫЙ ПРОСТРАНСТВЕННЫЙ ХАРАКТЕР (IE 0X20) В НАЧАЛЕ ЭТОЙ СТРОКИЭТА СТРОКА НАЧИНАЕТСЯ С ОДНОГО ХАРАКТЕРА ВКЛАДКИ IE 0X09, КАК СЛЕДУЮЩАЯ СТРОКАПредполагаемый конец был перед этой строкойи они не были обработаны tr+++++++++++++++ЗДЕСЬ ДОКУМЕНТ С << ОДИНОЧНЫЙ ПРОСТРАНСТВЕННЫЙ ХАРАКТЕР (IE 0X20) В НАЧАЛЕ ЭТОЙ СТРОКИЭТА СТРОКА НАЧИНАЕТСЯ С ОДНОГО ХАРАКТЕРА ВКЛАДКИ IE 0X09, КАК СЛЕДУЮЩАЯ СТРОКАEND_TEXTЭХО ПРЕДНАЗНАЧЕННЫЙ КОНЕЦ БЫЛ ПЕРЕД ЭТОЙ СТРОКОЙ, ЭХО, НО ПОТОМУ ЧТО СТРОКА С РАЗДЕЛЯЮЩИМ ИДЕНТИФИКАТОРОМ НАЧАЛАСЬ С ВКЛАДКИ, ОНА НЕ УЗНАВАЛАЭХО КОМАНДА TR ПРОДОЛЖАЕТ ОБРАБОТКУ.
Другое использование - вывод в файл:
$ cat << EOF> ~ / testFile001 > Этому тексту предшествуют 3 пробела. > В начале этой строки находится один символ табуляции. > Этому тексту ничего не предшествует EOF
Здесь струны
Здесь строка (доступно в Баше , KSH , или Zsh ) синтаксический аналогично, состоящая из <<<
, и эффектов перенаправления ввода от слова (последовательность рассматривается как единое целое с оболочкой, в этом контексте вообще строка буквального). В этом случае для слова используется обычный синтаксис оболочки («здесь строковый синтаксис»), причем единственным синтаксисом является перенаправление: здесь строка - это обычная строка, используемая для перенаправления ввода, а не особый вид строки.
Не нужно цитировать ни одного слова:
$ LANG = C tr az AZ <<< one ONE
В случае строки с пробелами ее необходимо заключить в кавычки:
$ LANG = C tr az AZ <<< 'one two three' ONE TWO THREE
Это также можно было бы записать как:
$ foo = 'one two three' $ LANG = C tr az AZ <<< " $ foo " ONE TWO THREE
Допускаются многострочные строки:
$ LANG = C tr az AZ <<< ' one > two three' ONE TWO THREE
Обратите внимание, что добавляются начальные и конечные символы новой строки:
$ LANG = C tr az AZ <<< ' > один > два три >'ОДИН ДВА ТРИ$
Ключевое отличие от документов здесь состоит в том, что в этих документах разделители находятся на отдельных строках; начальные и конечные символы новой строки удаляются. В отличие от документов здесь, здесь строки не используют разделители.
Здесь строки особенно полезны для команд, которые часто требуют короткого ввода, таких как калькулятор bc
:
$ bc <<< 2 ^ 10 1024
Обратите внимание, что здесь поведение строки также может быть выполнено (с изменением порядка) через конвейер и echo
команду, как в:
$ echo 'один, два, три' | ЯЗЫК = C tr az AZ ОДИН ДВА ТРИ
однако здесь строки особенно полезны, когда последняя команда должна выполняться в текущем процессе, как в случае со read
встроенной функцией:
$ echo 'один, два, три' | читать -rabc $ echo " $ a $ b $ c "
ничего не дает, в то время как
$ read -rabc <<< 'one two three' $ echo " $ a $ b $ c " one two three
Это происходит потому, что в предыдущем примере конвейерная система read
запускает подпроцесс и как таковая не может влиять на среду родительского процесса.
Microsoft NMAKE
В Microsoft NMAKE эти документы называются встроенными файлами . Встроенные файлы обозначаются как <<
или <
<<
отдельной строкой, за которой может следовать ключевое слово (без учета регистра) KEEP
или NOKEEP
чтобы указать, следует ли сохранить созданный файл.
target0 : зависимый 0 command0 <<временный встроенный файл ... <<target1 : зависимый 1 command1 <<временный, но сохраненный встроенный файл ...<< СОХРАНИТЬtarget2 : зависимый 2 команда2 << имя_файла2названный, но отброшенный встроенный файл ...<< NOKEEPtarget3 : зависимый 3 команда3 << имя_файла3именованный встроенный файл ...<< СОХРАНИТЬ
р
R не имеет файловых литералов, но обеспечивает эквивалентную функциональность, комбинируя строковые литералы с функцией преобразования строки в файл. R допускает произвольные пробелы в строках, включая символы новой строки. Затем строку можно превратить в дескриптор файла с помощью textConnection()
функции. Например, следующее превращает таблицу данных, встроенную в исходный код, в переменную фрейма данных:
str <- "Доход населения штата Неграмотность Life.Exp Убийство HS.Grad Frost Алабама 3615 3624 2,1 69,05 15,1 41,3 20 Аляска 365 6315 1,5 69,31 11,3 66,7 152 Аризона 2212 4530 1,8 70,55 7,8 58,1 15 Арканзас 2110 3378 1,9 70,66 10,1 39,9 65" x <- read.table ( textConnection ( str ), header = TRUE , row.names = 1 )
Сегмент данных
Perl [6] и Ruby [7] имеют форму литерала файла, который можно рассматривать как форму сегмента данных . В этих языках строчка __DATA__
(Perl) или __END__
(Ruby, старый Perl) отмечает конец сегмента кода и начало сегмента данных. Выполняется только содержимое до этой строки, а содержимое исходного файла после этой строки доступно как файловый объект: PACKAGE::DATA
в Perl (например, main::DATA
) и DATA
в Ruby. Как встроенный файл, они семантически аналогичны здесь документам, хотя может быть только один для каждого сценария. Однако в этих языках термин «здесь документ» вместо этого относится к многострочным строковым литералам, как обсуждается ниже.
Схема URI данных
Как поясняется далее в схеме Data URI , все основные веб-браузеры понимают URI, которые начинаются с data: как здесь документ.
Многострочные строковые литералы
Термин «здесь документ» или «здесь строка» также используется для многострочных строковых литералов в различных языках программирования, особенно Perl (синтаксис, на который влияет оболочка Unix) и языках, на которые влияет Perl, особенно PHP и Ruby. <<
Синтаксис в стиле оболочки часто сохраняется, несмотря на то, что он не используется для перенаправления ввода.
Под влиянием Perl
Perl
В Perl есть несколько способов вызывать здесь документы. [8] Разделители вокруг тега имеют такой же эффект внутри документа, как и в обычном строковом литерале: например, использование двойных кавычек вокруг тега позволяет интерполировать переменные , а использование одинарных кавычек - нет, а использование тег без них ведет себя как двойные кавычки. Использование обратных кавычек в качестве разделителей вокруг тега запускает содержимое heredoc как сценарий оболочки. Необходимо убедиться, что конечный тег находится в начале строки, иначе тег не будет распознан интерпретатором.
Обратите внимание, что здесь документ не начинается с тега, а начинается со следующей строки. Таким образом, оператор, содержащий тег, продолжается после тега.
Вот пример с двойными кавычками:
мой $ sender = "Баффи - истребительница вампиров" ; мой $ recipient = "Спайк" ;print << " КОНЕЦ ";Уважаемый получатель $,Я желаю тебе покинуть Саннидейл и больше никогда не возвращаться.Не совсем любовь, отправитель $КОНЕЦ
Выход:
Дорогой Спайк,Я желаю тебе покинуть Саннидейл и больше никогда не возвращаться.Не совсем любовь,Баффи истребительница вампиров
Вот пример с одинарными кавычками:
печать << ' КОНЕЦ '; Уважаемый получатель $,Я желаю тебе покинуть Саннидейл и больше никогда не возвращаться.Not Quite Love, $ sender END
Выход:
Уважаемый получатель $,Я желаю тебе покинуть Саннидейл и больше никогда не возвращаться.Не совсем любовь,$ отправитель
И пример с обратными кавычками (может быть непереносимым):
мой $ shell_script_stdout = << `КОНЕЦ` ; echo foo echo bar END
Можно запустить несколько heredocs в одной строке:
say ( << BEGIN . "это середина \ n" . << END ); Это является началом: НАЧАТЬ И в настоящее время он находится над ! КОНЕЦ # это эквивалентно: say ( "Это начало: \ nэто середина \ nИ теперь все кончено! \ n" );
Сам тег может содержать пробелы, что позволяет использовать heredocs без нарушения отступов .
скажите << 'КОНЕЦ' ; Привет, мир КОНЕЦ
Хотя, начиная с версии Perl 5.26, [9] heredocs может включать отступы:
#prints "Привет \ n" без пробелов в начале. если ( 1 ) { печать << ~ EOF ; Привет там EOF }
В дополнение к этим строкам Perl также имеет файловые литералы, а именно содержимое файла, следующего __DATA__
(ранее __END__
) на отдельной строке. Это доступно как файловый объект, PACKAGE::DATA
например main::DATA
, и может рассматриваться как форма сегмента данных .
PHP
В PHP здесь документы называются heredocs . В PHP heredocs не являются строковыми литералами. Текст Heredoc ведет себя так же, как строка в двойных кавычках, но без двойных кавычек. Например, значение `$` будет анализироваться как начало переменной, а `$ {` или `{$` как начало сложной переменной.
php $ name = "Джо Смит" ; $ Activity = "Программист" ; echo <<< EOFЭто раздел heredoc. Для получения дополнительной информации поговорите с $ name, вашим местным $ профессором.Спасибо!EOF ;$ toprint = <<< EOFПривет, $ name! Фактически, вы можете назначить раздел heredoc переменной!EOF ; echo $ toprint ;?>
Выходы
Это раздел heredoc.За дополнительной информацией обращайтесь к Джо Смиту, вашему местному программисту.Спасибо!Привет, Джо Смит! Фактически, вы можете назначить раздел heredoc переменной!
Строка, содержащая закрывающий идентификатор, не должна содержать никаких других символов, кроме необязательной конечной точки с запятой. В противном случае он не будет считаться закрывающим идентификатором, и PHP продолжит его поиск. Если правильный закрывающий идентификатор не найден, в последней строке скрипта появится ошибка синтаксического анализа. [10]
В PHP 5.3 и более поздних версиях, как и в Perl, можно не интерполировать переменные, заключив тег в одинарные кавычки; это называется nowdoc : [11]
$ x = <<< ' END ' Уважаемый получатель $!Я желаю тебе покинуть Саннидейл и больше никогда не возвращаться.Не совсем любовь, отправитель $ END ;
В PHP 5.3+ также можно заключить тег в двойные кавычки, что, как и Perl, дает тот же эффект, что и отсутствие окружения тега чем-либо вообще.
Рубин
Следующий код Ruby отображает список покупок с помощью документа здесь.
путы << GROCERY_LIST Бакалея список ---- 1. Салат микс. 2. Клубника. * 3. Злаки. 4. Молоко. * * Organic GROCERY_LIST
Результат:
$ ruby grocery-list.rb Список покупок ------------ 1. Салатный микс. 2. Клубника. * 3. Злаки. 4. Молоко. * * Органическое
Документ <<
в документе здесь не указывает перенаправление ввода, но Ruby также использует <<
перенаправление ввода, поэтому перенаправление в файл из документа здесь включает использование <<
дважды, в разных смыслах:
File :: open ( "список покупок" , "w" ) do | f | f << << GROCERY_LIST Список покупок ---- 1. Салатная смесь. 2. Клубника. * 3. Злаки. 4. Молоко. * * Organic GROCERY_LIST end
Как и в случае с оболочками Unix, Ruby также позволяет идентификатору-разделителю не начинаться с первого столбца строки, если начало документа здесь помечено немного другим начальным символом <<-
. Кроме того, Ruby обрабатывает здесь документы как строку, заключенную в двойные кавычки, и поэтому эту конструкцию можно использовать #{}
для интерполяции кода. Следующий пример иллюстрирует обе эти функции:
сейчас = Время . теперь ставит << - ВФ Это # {} now.hour часов Джон, где ваши дети? EOF
Ruby расширяет это, предоставляя синтаксис «<< ~» для исключения отступов в этом документе:
put << ~ EOF Эта строка имеет отступ в два пробела. Эта строка имеет отступ в четыре пробела. Эта строка имеет отступ в шесть пробелов. EOF
Общий отступ из двух пробелов опускается во всех строках:
$ ruby indented-heredoc.rb Эта строка имеет отступ в два пробела. Эта строка имеет отступ в четыре пробела. Эта строка имеет отступ в шесть пробелов.
Как и Perl, Ruby позволяет запускать несколько документов в одной строке:
put << BEGIN + "<--- middle ---> \ n " + << END Это начало: BEGIN И теперь все кончено! КОНЕЦ# это равняется этому выражению: put "Это начало: \ n <--- середина ---> \ n И теперь все кончено!"
Как и Perl, Ruby имеет файловые литералы, а именно содержимое файла, следующего __END__
на отдельной строке. Он доступен как файловый объект DATA
и может рассматриваться как форма сегмента данных .
Python
Python поддерживает многострочные строки как «дословную» строку.
print ( "" " Клиент: Не так уж много сыров? Владелец: Лучшее в округе, сэр. " "" )
Начиная с Python 3.6, дословные f-строки поддерживают интерполяцию переменных и выражений.
shop_type = "СЫР" почесть = "лучший" печать ( е ""» Клиент: Не так много { shop_type . опустить () } магазин это? Shopkeeper: { почести . капитализировать () } . В районе, сэр "" " )
D
Начиная с версии 2.0, D поддерживает здесь строки в стиле документа, в которых используется префиксный символ 'q'. Эти строки начинаются с, q"IDENT
за которым сразу следует новая строка (для произвольного идентификатора IDENT), и заканчиваются IDENT"
в начале строки.
int main () { string list = q "IDENT 1. Пункт один 2. Пункт два 3. Пункт три IDENT" ; writef ( список ); }
D также поддерживает несколько разделителей кавычек с аналогичным синтаксисом, при этом такие строки начинаются с q"[
и заканчиваются ]"
или аналогичным образом для другого символа-разделителя (любого из () <> {} или []).
OS / JCL
На языке IBM Job Control Language (JCL), используемом в более ранних версиях MVS и текущих операционных системах z / OS , данные, встроенные в поток заданий, могут быть идентифицированы знаком * в операторе DD, например или. В первом случае строки текста следуют и объединяются в псевдофайл с именем DD SYSIN. Все записи, следующие за командой, объединяются до тех пор, пока не появится другая команда OS / JCL (любая строка, начинающаяся с ), не будет найдена последовательность EOF по умолчанию ( ) или не произойдет физический конец данных. Во втором случае условия те же, за исключением того, что операнд DLM = используется для указания текстовой строки, сигнализирующей о конце данных, которая может использоваться, если поток данных содержит JCL (опять же, любая строка, начинающаяся с ), или последовательность (например, комментарии в исходном коде C или C ++). Следующее компилирует и выполняет программу на языке ассемблера, предоставленную ассемблеру как встроенные данные.//SYSIN DD *
//SYSIN DD *,DLM=text
//
/*
//
/*
// AHAR JOB ( 'ALEX HARRIS' ) // EXEC ASMLG // SYSIN DD * APROG START XR 15,15 BR 14 END / * // * ЗАВЕРШЕНИЕ ЗАДАНИЯ
Этот оператор является функциональным эквивалентом указания следующего потока данных, заканчивающегося символом .//SYSIN DD *
<
/*
Ракетка
Ракетка «S здесь строки начинаются с #<<
последующими символами , которые определяют терминатор для строки. [12] Содержимое строки включает все символы между #<<
строкой и строкой, единственным содержимым которой является указанный терминатор. Точнее, содержимое строки начинается после следующей за ней новой строки #<<
и заканчивается перед новой строкой , за которой следует терминатор.
#lang racket( displayln # << HERESTRING Это простая строка здесь в Racket. * One * Two * Three HERESTRING )
Выходы:
Это простая строка здесь в Racket. * Один * Два * Три
Между начальной и конечной строками не распознаются управляющие последовательности; все символы включаются в строку (и терминатор) буквально.
#lang racket( displayln # << Здесь строка в Racket ☺ Эта строка охватывает несколько строк и может содержать любой символ Unicode. Так что такие вещи, как λ, ☠, α, β, все в порядке.В следующей строке идет терминатор. Он также может содержать любой символ Unicode, даже пробелы и смайлы! А вот строка в Racket ☺ )
Выходы:
Эта строка охватывает несколько строки может содержать любой символ Юникода.Так что с такими вещами, как λ, ☠, α, β, все в порядке.В следующей строке идет терминатор. Он также может содержать любой символ Unicode, даже пробелы и смайлы!
Здесь строки могут обычно использоваться в контекстах, где обычные строки:
#lang racket( printf # << END Уважаемый ~ a,Спасибо за содержательный разговор ~ a. ~ аКОНЕЦ "Исаак" "вчера" "Карл" )
Выходы:
Дорогой Исаак,Спасибо за содержательную беседу вчера. Карл
Интересной альтернативой является использование расширения языка at-exp
для написания @ -выражений. [13] Они выглядят так:
#lang at-exp racket
(displayln @ string-append {Это длинная строка,очень удобно, когдадлинный фрагмент текстанужный.Не беспокойтесь о побеге"кавычки" или \ экранирования. Этотакже нормально иметь λ, γ, θ, ...Код для вставки:@(number->string (+ 3 4))
})
Выходы:
Это длинная строка,очень удобно, когдадлинный фрагмент текстанужный.Не беспокойтесь о побеге"кавычки" или \ экранирования. Этотакже нормально иметь λ, γ, θ, ...Код для вставки: 7
@ -Выражение не является специфическим и не ограничивается строками, это синтаксическая форма, которая может быть составлена с остальной частью языка.
Windows PowerShell
В Windows PowerShell эти документы называются здесь строками . Строка здесь - это строка, которая начинается с открытого разделителя ( @"
или @'
) и заканчивается закрывающим разделителем ( "@
или '@
) в самой строке, которая завершает строку. Все символы между открывающим и закрывающим разделителями считаются строковым литералом. Использование здесь-строки с двойными кавычками позволяет интерпретировать переменные , а использование одинарных кавычек - нет. Интерполяция переменных происходит с простыми переменными (например, $x
но НЕ $x.y
или $x[0]
). Вы можете выполнить набор операторов, вставив их $()
(например, $($x.y)
или $(Get-Process | Out-String)
).
В следующем коде PowerShell текст передается функции с помощью строки здесь. Функция ConvertTo-UpperCase
определяется следующим образом:
PS> функция ConvertTo-UpperCase ( $ string ) { $ string . ToUpper () } PS> ConvertTo-UpperCase @ ' >> one two three >> eins zwei drei >>' @ ONE TWO THREE EINS ZWEI DREI
Вот пример, демонстрирующий интерполяцию переменных и выполнение оператора с использованием строки в двойных кавычках:
PS> $ doc , $ marty = 'Доктор. Эммет Браун ' , ' Марти Макфлай ' PS> $ time = [DateTime] ' Пятница, 25 октября 1985 г. 8:00:00 ' PS> $ diff = New-TimeSpan -Minutes 25 PS> @ " >> $ doc: Это мои часы, которые я слышу? >> $ marty: Ага! Сейчас $ ($ time.Hour) o'clock! >> $ doc: Отлично! Мой эксперимент сработал! Они все ровно $ ($ diff.Minutes) ) минут медленно. >> $ марти: Погодите минутку. Погодите минутку. Док ... Вы говорите мне, что это $ (($ time + $ diff) .ToShortTimeString ())? >> $ doc: Точно. > > $ marty: Черт! Я опаздываю в школу! >> "@ Доктор Эммет Браун: Это мои часы, которые я слышу? Марти МакФлай: Ага! Эээ, сейчас 8 часов! Д-р Эммет Браун: Идеально! Мой эксперимент удался! Все они отстают ровно на 25 минут. Марти МакФлай: Погодите. Подождите минуту. Док ... Ты хочешь сказать, что сейчас 08:25? Д-р Эммет Браун: Совершенно верно. Марти МакФлай: Черт! Я опаздываю в школу!
Используя вместо этого строку здесь с одинарными кавычками, вывод будет выглядеть так: Вывод:
PS> @ ' >> $ doc: Это мои часы я слышу? >> $ Марти: Ага! Эээ, это $ ($ time.Hour) час! >> $ doc: Отлично! Мой эксперимент удался! Все они отстают ровно на $ ($ diff.Minutes) минут. >> $ Марти: Подожди минутку. Подождите минуту. Док ... Вы хотите сказать, что это $ (($ time + $ diff) .ToShortTimeString ())? >> $ doc: Точно. >> $ marty: Блин! Я опаздываю в школу! >> '@ $ doc: Это мои часы я слышу? $ Марти: Ага! Эээ, это $ ($ time.Hour) час! $ doc: Отлично! Мой эксперимент удался! Все они отстают ровно на $ ($ diff.Minutes) минут. $ Марти: Подожди минутку. Подождите минуту. Док ... Вы хотите сказать, что это $ (($ time + $ diff) .ToShortTimeString ())? $ doc: Совершенно верно. $ marty: Черт! Я опаздываю в школу!
ЦИФРОВОЙ командный язык (DCL)
В сценариях DCL любая строка ввода, которая не начинается с символа $, неявно рассматривается как ввод для предыдущей команды - все строки, которые не начинаются с символа $, являются здесь-документами. Входные данные либо передаются программе, либо на них можно явно ссылаться с помощью логического имени SYS $ INPUT (аналогично концепции stdin в Unix ).
Например, явная ссылка на ввод как SYS $ INPUT:
$ TYPE SYS $ INPUT Этот текст будет напрямую выведен на экран командой TYPE. $ ! другие команды ...
производит:
Этот текст будет напрямую отражен эхомна экран командой ТИП.
Кроме того, команда DECK, изначально предназначенная для поддержки перфокарт (отсюда и ее название: она означала начало колоды данных ), может использоваться для ввода данных в предыдущую команду. [14] Входная колода заканчивается либо командой $ EOD, либо шаблоном символов, заданным параметром / DOLLARS для DECK.
Пример программы суммирования денежных величин:
$ RUN ADD_SUMS.EXE$ DECK13,53 долл. США3,33 доллара США2,33 $$ EOD
Произойдет следующий вывод (предполагается, что ADD_SUMS был написан для чтения значений и их добавления):
19,19 $
Пример использования DECK / DOLLARS для создания одного командного файла из другого:
$ COPY SYS $ INPUT SYS $ SCRATCH : TEMP.COM $ DECK / DOLLARS = $$$$ $ TYPE SYS $ INPUT Это пример использования DECK для создания командного файла из командного файла $ $$ $ $ ! другие команды следуют ...
YAML
YAML в первую очередь полагается на отступы пробелов для структуры, что делает его устойчивым к столкновениям разделителей и способным представлять многострочные строки с помощью свернутых строковых литералов:
--- заголовок : «Пример из Heredoc стиле функциональности с помощью YAML» Дата : «2007-06-01» пример : > HTML переходит в YAML без модификации сообщения : |
«Три всегда больше двух,
даже для больших значений двух» - Автор неизвестен
Смотрите также
- Конвейер (Unix)
Рекомендации
- ^ a b «Здесь - Описание документа в стандарте POSIX / SUS» . Архивировано 27 апреля 2014 года . Проверено 20 апреля 2018 .
- ^ «Вот документ - Розеттский код» . rosettacode.org . Проверено 20 февраля 2017 .
- ^ a b Справочная страница Darwin tcsh
- ^ Уэйн Поллок. «Обзор документа Shell Here» . hccfl.edu. Архивировано из оригинала на 2014-05-29 . Проверено 28 мая 2014 .
- ^ См., Например, Использование переменных внутри bash heredoc
- ^ perldata: специальные литералы
- ^ Рубин: Объект: __END__
- ^ Операторы Perl и их приоритет
- ^ https://perldoc.perl.org/perl5260delta.html#Indented-Here-documents
- ^ Heredoc в руководстве по PHP
- ^ http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc
- ^ Здесь строка в документации по Racket
- ^ @ Синтаксис в документации по Racket
- ^ http://h71000.www7.hp.com/doc/83final/9996/9996pro_45.html
Общий
- Справочное руководство по Bash
- 3.6.6 Здесь документы
- 3.6.7 Здесь строки
- Расширенное руководство по сценариям на Bash , Мендель Купер
- Глава 19. Здесь документы
- 19.1. Здесь струны
- ^ Более подробно, в bash: «все строки здесь-документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \ новая строка игнорируется, и '\' необходимо использовать для заключения в кавычки символов '\', '$' и '' '. "Согласно 3.6.6 Here Documents . Обратите внимание, что
"
это не имеет особого значения в документе здесь и не требует экранирования, в отличие от строки в двойных кавычках; в остальном они практически идентичны. - ^ «Цитирование» включает в себя экранирование, поэтому, если
\EOF
используется, оно указывается в кавычках, поэтому интерполяция переменных не происходит и заканчивается наEOF
, а если\\EOF
используется, это указывается в кавычки и заканчивается на\EOF
. Это, возможно, неожиданное поведение, однако, легко реализуется в оболочке, поскольку токенизатор просто записывает токен, который был процитирован (на этапе оценки лексического анализа ), без необходимости сохранять исходное, процитированное значение.
Одно из приложений - использовать\'
в качестве начального разделителя и, следовательно,'
в качестве конечного разделителя, который похож на многострочный строковый литерал, но удаляет начальные и конечные разрывы строк. - ^ Обратите внимание, что хотя вкладки обычно можно вводить в редакторах, в командной строке они обычно вводятся с помощьюCtrl+V+Tab ↹из-за завершения вкладки , и в этом примере они являются фактическими вкладками, поэтому пример можно скопировать и вставить.
Внешние ссылки
- Вот документ . Ссылка на задачу Rosetta Code с примерами документов на более чем 15 языках.