Hier Dokument

Im Computer, a Hier Dokument (hier-dokument, Hier-Text, Heredoc, hier ist, hier-saiten oder hier-skript) ist eine Datei wörtlich oder Eingabestrom buchstäblich: Es ist ein Teil von a Quellcode Datei, die so behandelt wird, als wäre sie separat Datei. Der Begriff wird auch für eine Form von Multiline verwendet String -Literale Diese verwenden eine ähnliche Syntax, die Konservierungsbrüche und andere Whitespace (einschließlich Eindrückung) im Text.

Hier entsteht Dokumente in der Unix Shell,[1] und sind in der gefunden Bourne Shell (Sch), C Shell (CSH),[2] TCSH (TCSH),[3] Kornshell (ksh), Bourne wieder Shell (verprügeln), und Z Shell (ZSH), unter anderen. Hier finden Sie Streichliterale im Dokumentstil in verschiedenen hochrangige Sprachen, insbesondere der Perl Programmiersprache (Syntax inspiriert von Unix Shell) und Sprachen, die von Perl beeinflusst werden, wie z. Php und Rubin. JavaScript unterstützt diese Funktionalität auch über Vorlagenliterale, eine Funktion in seiner 6. Revision (Es6). Andere hochrangige Sprachen wie z. Python, Julia und Tcl haben andere Einrichtungen für multiline Saiten.

Hier können Dokumente entweder als Dateien oder als Zeichenfolgen behandelt werden. Einige Muscheln behandeln sie als als Formatzeichenfolge wörtlich, zulässt variable Substitution und Befehlssubstitution im wörtlichen.

Die häufigste Syntax für hier Dokumente, die aus Unix -Shells stammt, ist << gefolgt von einem abgrenzend Kennung (Oft das Wort Eof oder ENDE[4]), beginnend mit der nächsten Zeile, durch den zu zitierten Text und dann durch denselben abgrenzenden Kennung in seiner eigenen Zeile geschlossen. Diese Syntax liegt daran, dass hier Dokumente offiziell Literale gestreamt werden und der Inhalt des Dokuments auf umgeleitet wird Stdin (Standardeingabe) des vorhergehenden Befehls; Die hier Dokumentsyntax ist analog mit der Syntax für die Eingabe Umleitung, welches ist < "Eingabe aus der folgenden Datei".

Andere Sprachen verwenden häufig eine wesentlich ähnliche Syntax, aber Details der Syntax und der tatsächlichen Funktionalität können erheblich variieren. Wenn einfach für String -Literale verwendet, die << Zeigt keine Indirektion an, ist aber einfach eine Ausgrenzungskonvention. In einigen Sprachen wie Ruby, << wird auch für die Umleitung für die Eingabe verwendet, was dazu führt << zweimal verwendet werden, wenn man von einem hier dokumentstreicher Literal umleiten möchte.

Dateiliterale

Grenzweise sind hier Dokumente Dateiliterale oder Stream -Literale. Diese stammen aus der Unix -Shell, obwohl ähnliche Einrichtungen in einigen anderen Sprachen verfügbar sind.

Unix -Muscheln

Hier sind Dokumente in vielen Unix -Shells erhältlich.[1] Im folgenden Beispiel wird der Text an die übergeben tr Befehl (transliteriert nach oben in Oberfall) mit einem hier Dokument. Dies kann in einer Shell -Datei oder in einer Eingabeaufforderung interaktiv eingegeben werden.

$ Lang=C tr a-Z a-Z << Ende> Eins zwei drei > vier fünf sechs > Ende EINS ZWEI DREI VIER FÜNF SECHS 

ENDE wurde als abgrenzende Kennung verwendet. Es wurde das Start und Ende des hier Dokuments angegeben. Die Umleitung und die abgrenzende Kennung müssen nicht durch einen Raum getrennt werden: < oder << END Beide funktionieren gleich gut.

Standardmäßig ist das Verhalten weitgehend identisch mit dem Inhalt von Doppelzitaten: Variablennamen werden durch ihre Werte ersetzt, Befehle in Backticks werden bewertet usw. werden usw.[a]

$ cat << eof> \ $ Working Dir "$ pwd" `pwd` > Eof $ Arbeiten Dir "/Heimanwender" /Heimanwender

Dies kann deaktiviert werden, indem ein Teil des Etiketts angegeben wird, der dann mit dem nicht geeigneten Wert beendet wird.[b] Das Verhalten ist im Wesentlichen identisch mit dem, wenn der Inhalt in einzelnen Zitaten eingeschlossen war. Somit zum Beispiel, indem Sie es in einzelnen Zitate festlegen:

$ Katze << 'Eof' > \ $ Working Dir "$ pwd" `pwd` > Eof \ $ Arbeiten Dir "$ pwd" `pwd` 

Es können auch Doppelzitate verwendet werden, aber dies unterliegt Verwirrung, weil die Erweiterung tut in einer doppelt zitierten Zeichenfolge auftreten, aber tut nicht treten in einem hier Dokument mit doppelt zitiertem Trennzeichen auf.[5] Ein- und doppelt zitierte Grenzwerte werden in einigen anderen Sprachen unterschieden, insbesondere in anderen Sprachen Perl (Siehe unten), wobei das Verhalten der entsprechenden Zeichenfolge entspricht.

Im POSIX Shell Aber nicht CSH/TCSH, wobei ein minus Zeichen an die Anhang angemeldet ist << (d.h. <<-) hat den Effekt, dass führende Registerkarten ignoriert werden.[3] Dies ermöglicht die Einführung von hier Dokumente in Shell -Skripten (hauptsächlich zur Ausrichtung auf die vorhandene Eindringung), ohne ihren Wert zu ändern:[c]

Ein Skript mit:

Lang=C tr a-Z a-Z <<- END_TEXT Hier doc mit <<--  Ein einzelner Raumzeichen (d. H. 0x20) befindet sich am Anfang dieser Zeile Diese Zeile beginnt mit einem einzelnen Registerkarte, d. H. 0x09 wie die nächste Zeile End_text Echo Das beabsichtigte Ende war vor dieser LinieEcho und diese wurden nicht von TR verarbeitetEcho +++++++++++++++ Lang=C tr a-Z a-Z << END_TEXT Hier doc mit <<  Ein einzelner Raumzeichen (d. H. 0x20) befindet sich am Anfang dieser Zeile Diese Zeile beginnt mit einem einzelnen Registerkarte, d. H. 0x09 wie die nächste Zeile End_text Echo Das beabsichtigte Ende war vor dieser Linie,Echo Aber weil die Linie mit der abgrenzenden Kennung mit einem Tab begann, wurde sie nicht erkannt undEcho der tr Befehl Fortsetzung der Verarbeitung.

produziert:

Hier doc mit <<- Ein einzelner Speicherzeichen (d. H. 0x20) steht am Anfang dieser Zeile. Diese Zeile beginnt mit einem einzelnen Registerkartenzeichen, d. H. 0x09, ebenso wie die nächste Zeile, die das beabsichtigte Ende vor dieser Zeile war und diese nicht von TR verarbeitet wurden +++++++++++++++ hier doc mit << Ein einzelner Speicherzeichen (d. H. 0x20) befindet End_text widerspiegelt das beabsichtigte Ende vor dieser Zeile, Echo, aber weil die Linie mit der abgrenzenden Kennung mit einer Registerkarte begann, wurde sie nicht erkannt und die TR -Befehls fortgesetzt.

Eine andere Verwendung ist die Ausgabe in eine Datei:

$ cat << eof> ~/testFile001> 3 Leerzeichen gehen diesem Text voraus. > Ein einzelnes Registerkarte steht am Anfang dieser Zeile. > Nichts geht diesem Text voraus Eof 

Hier Strings

A hier String (verfügbar in verprügeln, ksh, oder ZSH) ist syntaktisch ähnlich und besteht aus <<<und Effekte Eingabeumleitung von a Wort (Eine Sequenz, die von der Hülle als Einheit behandelt wird, in diesem Zusammenhang im Allgemeinen eine Saitenliteral). In diesem Fall wird die übliche Shell -Syntax für das Wort verwendet („hier String -Syntax“), wobei die einzige Syntax die Umleitung ist: Eine hier eine gewöhnliche Zeichenfolge ist für die Umleitung für Eingaben und keine spezielle Art von String.

Ein einzelnes Wort muss nicht zitiert werden:

$ Lang=C tr a-Z a-Z <<< einesEINES 

Bei einer Zeichenfolge mit Leerzeichen muss sie zitiert werden:

$ Lang=C tr a-Z a-Z <<< 'eins zwei drei' EINS ZWEI DREI 

Dies könnte auch geschrieben werden als:

$ Foo='eins zwei drei' $ Lang=C tr a-Z a-Z <<< "$ foo" EINS ZWEI DREI 

Multiline -Saiten sind akzeptabel und ergeben:

$ Lang=C tr a-Z a-Z <<< 'eines> Zwei drei ' EINES ZWEI DREI 

Beachten Sie, dass führende und nachfolgende Newlines, falls vorhanden, enthalten sind:

$ Lang=C tr a-Z a-Z <<< ' > eins > Zwei drei > ' EINES ZWEI DREI $ 

Der Hauptunterschied von hier ist, dass Dokumente in den hier Dokumenten in getrennten Zeilen sind. Die führenden und nachlaufenden Newlines werden abgezogen. Im Gegensatz zu hier Dokumente verwenden die Zeichenfolgen keine Grenzwerte.

Hier sind Zeichenfolgen besonders nützlich für Befehle, die häufig eine kurze Eingabe erfordern, z. B. den Taschenrechner BC:

$ BC <<< 2^101024 

Beachten Sie, dass das Verhalten des String -Verhaltens auch durch Rohrleitungen erreicht werden kann (um die Reihenfolge umzukehren) Echo Befehl wie in:

$ Echo 'eins zwei drei' | Lang=C tr a-Z a-ZEINS ZWEI DREI 

Hier sind Strings jedoch besonders nützlich, wenn der letzte Befehl im aktuellen Prozess ausgeführt werden muss, wie es bei der der Fall der Fall ist lesen gebaut:

$ Echo 'eins zwei drei' | lesen -r a b c$ Echo "$ a $ b $ c" 

liefert nichts während

$ lesen -r a b c <<< 'eins zwei drei' $ Echo "$ a $ b $ c" eins zwei drei 

Dies geschieht, weil in den vorherigen Beispielrohrleitungen verursacht werden lesen in einem Subprozess zu laufen und als solches die Umgebung des übergeordneten Prozesses nicht beeinträchtigen.

Microsoft Nmake

Im Microsoft Nmake, hier werden Dokumente als als bezeichnet als Inline -Dateien. Inline -Dateien werden als bezeichnet als << oder <: Die erste Notation erstellt eine temporäre Datei, die zweite Notation erstellt (oder überschreibt) die Datei mit dem angegebenen Pfadname. Eine Inline -Datei wird beendet mit << Auf einer Zeile selbst, optional gefolgt von dem (Fall-unempfindlichen) Schlüsselwort BEHALTEN oder Kein Keep Um anzugeben, ob die erstellte Datei aufbewahrt werden sollte.

Ziel0: abhängig0 command0 <<vorübergehend in der Reihe Datei ... << Ziel1: abhängig1 Kommando1 <<vorübergehend, aber konserviert in der Reihe Datei ... <  Ziel2: abhängig2 command2 << Dateiname2genannt, aber weggeworfen in der Reihe Datei ... <  target3: abhängig3 command3 << Dateiname3genannt in der Reihe Datei ... < 

R

R Hat keine Dateiliterale, bietet jedoch eine äquivalente Funktionalität, indem String-Literale mit einer Funktion von String-to-Datei kombiniert werden. R ermöglicht willkürliche Whitespace, einschließlich Neulinen, in Saiten. Eine Zeichenfolge kann dann in a umgewandelt werden Dateideskriptor Verwendung der textConnection () Funktion. Beispielsweise verwandelt die folgende Datentabelle, die in den Quellcode eingebettet ist, in eine Datenrahmenvariable:

str <- "Landesbevölkerung Einkommen Analphabetismus Leben. Alabama 3615 3624 2.1 69.05 15,1 41,3 20 20 Alaska 365 6315 1.5 69.31 11.3 66.7 152 Arizona 2212 4530 1.8 70,55 7,8 58.1 15 Arkansas 2110 3378 1.9 70.66 10.1 39,9 65 " x <- read.table(textconnection(str), Header=STIMMT, row.names=1) 

Datensegment

Perl[6] und Rubin[7] haben eine Form von Dateien wörtlich, die als Form von betrachtet werden kann Datensegment. In diesen Sprachen, einschließlich der Linie __DATEN__ (Perl) oder __ENDE__ (Ruby, Old Perl) markiert das Ende der Codesegment und den Beginn des Datensegments. Nur der Inhalt vor dieser Zeile wird ausgeführt, und der Inhalt der Quelldatei nach dieser Zeile ist als Dateiobjekt verfügbar: Paket :: Daten in Perl (z. B.,, Hauptinformationen) und DATEN in Ruby. Als Inline -Datei ähneln diese semantisch den hier Dokumenten, obwohl es nur eine pro Skript geben kann. In diesen Sprachen bezieht sich jedoch der Begriff "hier Dokument" stattdessen auf multiline String -Literale, wie unten erläutert.

Daten URI -Schema

Wie weiter erklärt in Daten URI -SchemaAlle großen Webbrowser verstehen URIs, die mit beginnen Daten: Wie hier Dokument.

Multiline -Streichliterale

Der Begriff "hier Dokument" oder "hier String" wird auch für Multiline verwendet String -Literale In verschiedenen Programmiersprachen, insbesondere Perl (Syntax beeinflusst von Unix -Shell) und Sprachen, die von Perl beeinflusst werden, insbesondere von PHP und Ruby. Das Shell-Stil << Die Syntax wird häufig beibehalten, obwohl sie nicht zur Umleitung für die Eingabe verwendet werden.

Perl beeinflusst

Perl

In Perl gibt es hier verschiedene Möglichkeiten, hier Dokumente aufzurufen.[8] Die Abgrenzer um das Tag haben den gleichen Effekt innerhalb des hier DOC wie in einem regulären String -Literal: Beispiel Variablen, die interpoliert werden sollenAber die Verwendung von einzelnen Zitaten nicht und die Verwendung des Tags ohne sich beide wie Doppelzitate verhält. Die Verwendung von Backticks als Grenzwerte um das Tag führt den Inhalt des Heredoc als Shell -Skript aus. Es ist notwendig, sicherzustellen, dass sich das End -Tag am Anfang der Linie befindet oder das Tag nicht vom Dolmetscher erkannt wird.

Beachten Sie, dass der hier nicht am Tag beginnt - aber eher beginnt in der nächsten Zeile. Die Anweisung, die das Tag enthält, wird also nach dem Tag fortgesetzt.

Hier ist ein Beispiel mit doppelten Zitaten:

mein $ Sender = "Buffy the Vampire Slayer"; mein $ Empfänger = "Spitze"; drucken <<"ENDE"; Sehr geehrter $ Empfänger, Ich möchte, dass Sie Sunnydale verlassen und niemals zurückkehren. Nicht ganz Liebe, $ Sender ENDE 

Ausgabe:

Lieber Spike, ich möchte, dass Sie Sunnydale verlassen und niemals zurückkehren. Nicht ganz Liebe, Buffy the Vampire Slayer

Hier ist ein Beispiel mit einzelnen Zitaten:

drucken <<'ENDE'; Sehr geehrter $ Empfänger, Ich möchte, dass Sie Sunnydale verlassen und niemals zurückkehren. Nicht ganz Liebe, $ Sender ENDE 

Ausgabe:

Sehr geehrter Empfänger, ich möchte, dass Sie Sunnydale verlassen und niemals zurückkehren. Nicht ganz Liebe, $ Sender

Und ein Beispiel mit Backticks (möglicherweise nicht tragbar):

mein $ Shell_script_stdout = <<`End`; Echo Foo Echo Bar ENDE 

Es ist möglich, mehrere Heredocs in derselben Zeile zu starten:

sagen(<<START . "Dies ist die Mitte \ n" . <<ENDE); Dies ist das Anfang: START Und jetzt es ist Über! ENDE # Dies entspricht: sagen("Dies ist der Anfang: \ nthis ist die Mitte, jetzt ist es vorbei! \ N"); 

Das Tag selbst kann Weißespace enthalten, die es ermöglichen können, dass Heredocs ohne Brechen verwendet werden können Vertiefung.

  sagen <<'  ENDE'; Hallo Welt  ENDE 

Obwohl seit Perl Version 5.26,[9] Heredocs können die Unbehagen beinhalten:

  #prints "Hallo \ n" ohne führende Weißespace.  wenn (1) {  drucken <<~Eof;  Hallo dort  Eof  } 

Zusätzlich zu diesen Zeichenfolgen bietet Perl auch Dateiliterale, nämlich den Inhalt der folgenden Datei __DATEN__ (früher __ENDE__) auf einer Zeile selbst. Dies ist als Dateiobjekt zugänglich Paket :: Daten wie zum Beispiel Hauptinformationenund kann als eine Form von angesehen werden Datensegment.

Php

In PHP werden hier Dokumente als als bezeichnet als Heredocs. In PHP -Heredocs sind keine Streicherliterale. Der Heredoc-Text verhält sich wie eine doppelt zitierte Zeichenfolge, jedoch ohne die Doppelzitate. Zum Beispiel wird "$" als Variablenstart analysiert, und "$ {" oder "{$" als komplexer Variablenstart.

   $ name  = "Joe Smith"; $ Beruf = "Programmierer"; Echo <<<Eof Dies ist ein Heredoc -Abschnitt. Weitere Informationen finden Sie mit $ name, Ihrem örtlichen $ -Beuf. Vielen Dank! Eof; $ toprint = <<<Eof Hey $ Name! Sie können den Heredoc -Abschnitt einer Variablen tatsächlich zuweisen! Eof; Echo $ toprint; ?> 

Ausgänge

Dies ist ein Heredoc -Abschnitt. Weitere Informationen finden Sie mit Joe Smith, Ihrem lokalen Programmierer. Vielen Dank! Hey Joe Smith! Sie können den Heredoc -Abschnitt einer Variablen tatsächlich zuweisen!

In PHP -Versionen vor 7.3 darf die Zeile, die die Schließkennung enthält, keine anderen Zeichen enthalten, außer einem optionalen Ende -Semikolon. Andernfalls gilt es nicht als abschließende Kennung, und PHP sucht weiterhin nach einem. Wenn keine ordnungsgemäße Abschlusskennung gefunden wird, entsteht ein Parse -Fehler in der letzten Zeile des Skripts. Aus Version 7.3 ist jedoch nicht mehr erforderlich, dass die Abschlusskennung von einem Semikolon oder einer neuen Linie folgt. Zusätzlich kann die schließende Kennung eingerichtet werden. In diesem Fall wird die Eindrücke aus allen Zeilen in der DOC -Zeichenfolge abgezogen.[10]

In PHP 5.3 und später wie Perl ist es möglich, Variablen nicht durch die Umgebung des Tags mit einzelnen Zitaten zu interpolieren. Dies wird a genannt Nowdoc:[11]

$ x = <<<'ENDE' Sehr geehrter $ Empfänger, Ich möchte, dass Sie Sunnydale verlassen und niemals zurückkehren. Nicht ganz Liebe, $ Sender ENDE; 

In PHP 5.3+ ist es auch möglich, das Tag mit doppelten Zitaten zu umgeben, die wie Perl den gleichen Effekt haben wie das Tag mit nichts.

Rubin

Der folgende Ruby -Code zeigt eine Lebensmittelliste an, indem Sie ein hier Dokument verwenden.

stellt <<EINKAUFSLISTE Einkaufsliste ---- 1. Salatmischung. 2. Erdbeeren.* 3. Müsli. 4. Milch.*   * Bio EINKAUFSLISTE 

Das Ergebnis:

$ Ruby Grocery-List.RBEinkaufsliste ------------ 1. Salatmischung. 2. Erdbeeren.* 3. Müsli. 4. Milch.*   * Bio 

Das << In einem hier gibt Dokument keine Eingabeumleitung an, aber Ruby verwendet auch Ruby << Für die Umleitungsumleitung für die Eingabe, um eine Datei aus einem hier Dokument umzuleiten, beinhaltet die Verwendung << zweimal in verschiedenen Sinnen:

Datei::offen("Einkaufsliste", "W") tun |f|  f << <<EINKAUFSLISTE Einkaufsliste ---- 1. Salatmischung. 2. Erdbeeren.* 3. Müsli. 4. Milch.*   * Bio EINKAUFSLISTE Ende 

Wie bei UNIX -Shells ermöglicht Ruby auch, dass der abgrenzende Kennung nicht mit der ersten Spalte einer Zeile startet. <<-. Außerdem dokumentiert Ruby hier als doppelt zitierte Zeichenfolge, und als solche ist es möglich, die zu verwenden #{} Konstruieren, um den Code zu interpolieren. Das folgende Beispiel zeigt beide Merkmale:

jetzt = Zeit.jetzt stellt <<-Eof   Es ist #{now.hour} o'clock John, wo sind deine Kinder?   Eof 

Ruby erweitert dies, indem es die "<< ~" -Syntax zum Auslassen der Eindrücke im Here -Dokument bereitstellt:

stellt <<~Eof   Diese Linie ist zwei Plätze eingerückt.     Diese Linie ist vier Plätze eingerückt.       Diese Linie ist sechs Plätze eingerückt.   Eof 

Die gemeinsame Einklingung von zwei Räumen wird aus allen Linien weggelassen:

$ Ruby Intored-Heredoc.RBDiese Linie ist zwei Plätze eingerückt.   Diese Linie ist vier Plätze eingerückt.     Diese Linie ist sechs Plätze eingerückt. 

Wie Perl ermöglicht Ruby das Starten mehrerer hier Dokumente in einer Zeile:

stellt <<START + "<--- Mitte --->\n" + <<ENDE Das ist der Anfang: START Und jetzt ist es vorbei! ENDE # Dies entspricht diesem Ausdruck: stellt "Das ist der Anfang:\n<--- middle --->\nUnd jetzt ist es vorbei! " 

Wie bei Perl bietet Ruby Dateiliterale, nämlich den Inhalt der folgenden Datei __ENDE__ auf einer Zeile für sich. Dies ist als Dateiobjekt zugänglich DATEN und kann als eine Form von angesehen werden Datensegment.

Python

Python Unterstützt Multi-Line-Zeichenfolgen als "wörtliche" Zeichenfolge.

drucken("" " Kunde: Nicht viel Käsegeschäft ist es? Ladenbesitzer: Am besten im Distrikt, Sir. "" ") 

Ab Python 3.6 unterstützen wörtliche F-Strings Variable und Expression Interpolation.

Shop_type = "KÄSE" Akkolade = "Feinst" drucken(f"" " Kunde: Nicht viel von a {Shop_type.niedriger()} Shop ist es? Ladenbesitzer: {Akkolade.profitieren()} Im Distrikt, Sir. "" ") 

C ++

Seit C ++ 11, C ++ unterstützt String -Literale mit benutzerdefiniertem Trennzeichen:

Const verkohlen* str = R"Custom_delimiter (Start der String. Neue Zeile Slash \ QUOTE "'Parens) (Ende der String) Custom_delimiter"; printf("%s", str); 

wird ausdrucken

Start der String. Neue Zeile Slash \ QUOTE "'PARENS) (Ende der String

D

Seit Version 2.0, D Hat Unterstützung für die Saiten im Dokumentstil mit dem 'Q'-Präfixcharakter. Diese Saiten beginnen mit Q "Ident unmittelbar gefolgt von einer neuen Linie (für eine willkürliche Identifikationsident) und enden mit Identifizieren " Zu Beginn einer Linie.

int hauptsächlich() {  Saite aufführen = q"Ident 1. Artikel eins 2. Punkt zwei 3. Punkt drei Identifizieren ";  writef( aufführen ); } 

D unterstützt auch einige Zitat -Abgrenzer mit ähnlicher Syntax, mit solchen Saiten beginnt mit q"[ und enden mit ] " oder ähnlich für ein anderes Trennzeichen (eine von () <> {} oder []).

OS/JCL

Auf IBM Arbeitskontrollsprache (JCL) in seiner früheren verwendet MVS und Strom Z/OS Betriebssysteme, Daten, die in einen Jobstrom einbezogen werden//SYSIN DD * oder//SYSIN DD *,DLM=textIm ersten Fall folgen die Textzeilen und werden zu einer Pseudo -Datei mit dem DD -Namensysin kombiniert. Alle folgenden Datensätze, die dem Befehl folgen, werden kombiniert, bis entweder ein anderer OS/JCL -Befehl auftritt (jede Zeile mit Beginn mit //), der Standard Eof Reihenfolge (/*) wird gefunden oder das physische Ende der Daten tritt auf. Im zweiten Fall sind die Bedingungen gleich, außer Der DLM = Operand wird verwendet, um das Signalisierungsende der Textzeichenfolge anzugeben, die verwendet werden kann, wenn ein Datenstrom JCL enthält (erneut jede Zeile mit Beginn mit //), oder der /* Sequenz (z. B. Kommentare in C oder C ++ Quellcode). Das folgende Programm erstellt und führt ein Assemblerprogramm aus, das als Inline-Daten an den Assembler geliefert wird.

//Ahar ARBEIT ("Alex Harris") //  Geschäftsführer ASMLG //SYSIN Dd * APROG -Start         XR 15,15         BR 14         ENDE /* //* Job endet 

Das //SYSIN DD * Aussage ist das funktionale Äquivalent von<* Der Datenstrom, der folgt, beendet nach /*.

Schläger

Schläger's Hier Strings beginnen mit #<< gefolgt von Zeichen, die einen Terminator für die Zeichenfolge definieren.[12] Der Inhalt der Zeichenfolge enthält alle Zeichen zwischen dem #<< Zeile und eine Linie, deren einziger Inhalt der angegebene Terminator ist. Genauer gesagt beginnt der Inhalt der Zeichenfolge nach einer neuen Linie #<<und es endet vor einer neuen Linie, gefolgt vom Terminator.

#lang Schläger (displayln  #<< Herestring Dies ist eine einfache Schnur hier im Schläger.   * Einer   * Zwei   * Drei Herestring  ) 

Ausgänge:

Dies ist eine einfache Schnur hier im Schläger. * Eins zwei drei

Es werden keine Fluchtsequenzen zwischen den Start- und Beendigungslinien erkannt. Alle Zeichen sind buchstäblich im String (und Terminator) enthalten.

#lang Schläger (displayln  #<< Ein hier String im Schläger ☺ Diese Zeichenfolge erstreckt sich über mehrere Zeilen und kann jedes Unicode -Symbol enthalten. Dinge wie λ, ☠, α, β sind also alle in Ordnung. In der nächsten Zeile kommt der Terminator. Es kann auch jedes Unicode -Symbol enthalten, sogar Räume und Smileys! Eine hier String im Schläger ☺  ) 

Ausgänge:

Diese String erstreckt sich über mehrere Zeilen und kann jedes Unicode -Symbol enthalten. Dinge wie λ, ☠, α, β sind also alle in Ordnung. In der nächsten Zeile kommt der Terminator. Es kann auch jedes Unicode -Symbol enthalten, sogar Räume und Smileys!

Hier können Saiten normalerweise in Kontexten verwendet werden, in denen normale Zeichenfolgen:

#lang Schläger (printf #<< Ende Lieber ~ a,, Danke für das aufschlussreiche Gespräch ~ a.                 ~ a ENDE  "Isaac"  "gestern"  "Carl") 

Ausgänge:

Lieber Isaac, danke für das aufschlussreiche Gespräch gestern. Carl

Eine interessante Alternative besteht darin, die Spracherweiterung zu verwenden AT-EXP um @-expressions zu schreiben.[13] Sie sehen so aus:

#lang at-exp racket (displayln @String-append {Dies ist eine lange Zeichenfolge, die sehr praktisch ist, wenn ein langer Teil des Textes erforderlich ist. Keine Sorge über die Entweichen von "Zitaten" oder \ Escapes. Es ist auch in Ordnung, λ, γ, θ, ... einbetten zu können Code: @(number->string (+ 3 4)) })

Ausgänge:

Dies ist eine lange Zeichenfolge, die sehr praktisch ist, wenn ein langer Teil des Textes benötigt wird. Keine Sorge über die Flucht "Zitate" oder \ Escapes. Es ist auch in Ordnung, λ, γ, θ, ... Einbettungscode: 7 zu haben: 7

Eine @-expression ist weder spezifisch noch auf Zeichenfolgen beschränkt. Es handelt sich um eine Syntaxform, die mit dem Rest der Sprache komponiert werden kann.

Windows PowerShell

Im Windows PowerShell, hier werden Dokumente als als bezeichnet als Hier. Eine hier String ist eine Zeichenfolge, die mit einem offenen Trennzeichen beginnt (@" oder @') und endet mit einem engen Trennzeichen ("@ oder '@) auf einer Zeile selbst, die die Zeichenfolge endet. Alle Zeichen zwischen dem offenen und dem engen Trennzeichen gelten als String -Literal. Verwenden einer hier-String mit doppelten Zitaten erlaubt es Variablen zu interpretieren, mit einzelnen Zitaten nicht.Variable Interpolation tritt mit einfachen Variablen auf (z. $ x aber nicht $ X.Y oder $ x [0]). Sie können eine Reihe von Aussagen ausführen, indem Sie sie einsetzen $ () (z.B. $ ($ X.Y) oder $ (Get-Process | Out-String)).

Im folgenden PowerShell-Code wird der Text mit einer hier String an eine Funktion übergeben. Die Funktion Converto-Suppercase wird wie folgt definiert:

Ps> Funktion Converto-Suppercase($ String) { $ String.Toupper() }   Ps> Converto-Suppercase @' >> Eins zwei drei >> Einins Zweii Drei >> '@ EINS ZWEI DREI Einins Zwei Dei 

Hier ist ein Beispiel, das eine variable Interpolation und Anweisungsausführung unter Verwendung einer hier-String mit Doppelzitaten zeigt:

Ps> $ doc, $ Marty = 'DR. Emmett Brown ', "Marty McFly" Ps> $ Zeit = [Terminzeit]"Freitag, 25. Oktober 1985 8:00:00 Uhr" Ps> $ diff = New-Timespan -Protokoll 25 Ps> @" >> $ doc: Sind das meine Uhren, die ich höre? >> $ marty: Ja! Äh, es ist $ ($ time.bour) Uhr! >> $ doc: Perfekt! Mein Experiment hat funktioniert! Sie sind alle genau $ ($ diff.minutes) Minuten langsam. >> $ marty: Warte eine Minute. Warten Sie eine Minute. Doc ... sagst du mir, dass es $ ist (($ time + $ diff) .toshortTimestring ())? >> $ doc: Genau. >> $ marty: Verdammt! Ich bin spät dran für die Schule! >> "@ Dr. Emmett Brown: Sind das meine Uhren, die ich höre? Marty McFly: Ja! Äh, es ist 8 Uhr! Dr. Emmett Brown: Perfekt! Mein Experiment hat funktioniert! Sie sind alle genau 25 Minuten langsam. Marty McFly: Warte eine Minute. Warten Sie eine Minute. Doc ... sagst du mir, dass es 08:25 ist? Dr. Emmett Brown: Genau. Marty McFly: Verdammt! Ich bin spät dran für die Schule! 

Wenn Sie stattdessen eine hier-String mit einzelnen Zitaten verwenden, würde der Ausgang so aussehen:

Ps> @' >> $ doc: Sind das meine Uhren, die ich höre? >> $ marty: Ja! Äh, es ist $ ($ time.bour) Uhr! >> $ doc: Perfekt! Mein Experiment hat funktioniert! Sie sind alle genau $ ($ diff.minutes) Minuten langsam. >> $ marty: Warte eine Minute. Warten Sie eine Minute. Doc ... sagst du mir, dass es $ ist (($ time + $ diff) .toshortTimestring ())? >> $ doc: Genau. >> $ marty: Verdammt! Ich bin spät dran für die Schule! >> '@ $ doc: Sind das meine Uhren, die ich höre? $ Marty: Ja! Äh, es ist $ ($ time.bour) Uhr! $ doc: Perfekt! Mein Experiment hat funktioniert! Sie sind alle genau $ ($ diff.minutes) Minuten langsam. $ Marty: Warte eine Minute. Warten Sie eine Minute. Doc ... sagst du mir, dass es $ ist (($ time + $ diff) .toshortTimestring ())? $ doc: Genau. $ Marty: Verdammt! Ich bin spät dran für die Schule! 

Digitale Befehlssprache (DCL)

Im DCL -SkripteJede Eingangslinie, die nicht mit einem $ -Symbol beginnt, wird implizit als Eingabe für den vorhergehenden Befehl behandelt - alle Zeilen, die nicht mit $ beginnen, sind hier Documents. Die Eingabe wird entweder an das Programm übergeben oder kann explizit durch den logischen Namen SYS $ Eingabe (analog zum UNIX -Konzept von Stdin).

Zum Beispiel die Eingabe als SYS $ -Input explizit verweisen:

$ Typ sys$ Input Dieser Text wird direkt wiederholt auf den Bildschirm nach dem Befehl Typ. $! Andere Befehle ...

produziert:

Dieser Text wird durch den Befehl Typ direkt auf den Bildschirm wiedergegeben.

Darüber hinaus war der Befehl Deck, der ursprünglich für die Unterstützung des Lochkartens bestimmt war (daher der Name: Es bedeutete den Beginn von a Datendeck) kann verwendet werden, um Eingaben für den vorhergehenden Befehl zu liefern.[14] Das Eingangsdeck wird entweder vom Befehl $ eod oder das durch den Parameter /Dollar an Deck angegebene Zeichenmuster beendet.

Beispiel eines Programms mit Gesamtausschüttungswerten:

$ Run add_sums.exe $ Deck $ 13.53 $ 3,33 $ 2,33 $ EOD

Würde die folgende Ausgabe erzeugen (vermutet add_sums wurde geschrieben, um die Werte zu lesen und hinzuzufügen):

$ 19.19

Beispiel für die Verwendung von Deck /Dollar, um eine Befehlsdatei aus einer anderen zu erstellen:

$ Kopieren sys$ Input Sys$ Scratch: Temp.com$ Deck /Dollar=$$$$ $ Typ sys$ Input Dies ist ein Beispiel für die Verwendung von Deck zum Erstellen Eine Befehlsdatei aus einer Befehlsdatei $$$$$! Andere Befehle folgen ...

Yaml

YAML stützt sich hauptsächlich auf die Struktur der Whitespace -Einrückung, wodurch es resistent wird Grenzkollision und fähig, die Multi-Line-Zeichenfolgen mit gefalteten String-Literalen darstellen:

--- Bildbeschriftung: "Beispiel von Heredoc-Stil Funktionalität Verwendung Yaml " Datum:  "2007-06-01" Beispiel: >  HTML geht ohne Änderung in Yaml ein Botschaft: |  

"Three is always greater than two, auch für große Werte von zwei "</p>

--Author Unknown

Siehe auch

Verweise

  1. ^ a b "Hierdokumentbeschreibung im POSIX/SUS-Standard". Archiviert vom Original am 2014-04-27. Abgerufen 2018-04-20.
  2. ^ "Hier Dokument - Rosetta Code". Rosettacode.org. Abgerufen 2017-02-20.
  3. ^ a b Darwin Tcsh Man Seite
  4. ^ Wayne Pollock. "Shell hier Dokumentübersicht". hccfl.edu. Archiviert von das Original Am 2014-05-29. Abgerufen 2014-05-28.
  5. ^ Siehe zum Beispiel Verwenden von Variablen in einem Bash -Heredoc
  6. ^ PERLDATA: Spezielle Literale
  7. ^ Ruby: Objekt: __ENDE__
  8. ^ Perl -Operatoren und Vorrang
  9. ^ "Perl5260Delta - Was ist neu für Perl v5.26.0 - PERLDOC -Browser".
  10. ^ Heredoc im PHP -Handbuch
  11. ^ "PHP: Zeichenfolgen - Handbuch".
  12. ^ Hier String in Schlägerdokumentation
  13. ^ @ Syntax in Schlägerdokumentation
  14. ^ "Archivierte Kopie". Archiviert von das Original am 2016-03-04. Abgerufen 2015-04-21.{{}}: CS1 Wartung: Archiviertes Kopie als Titel (Link)

Allgemein

  1. ^ In Bash: „Alle Zeilen des Here-Documents werden einer Parameterausdehnung, Befehlssubstitution und arithmetischer Expansion unterzogen. Im letzteren Fall wird die Zeichensequenz \ Newline ignoriert und "\" muss verwendet werden, um die Zeichen "\", "$" und "" "zu zitieren. 3.6.6 Hier Dokumente. Beachten Sie, dass " Hat in einem hier Dokument keine besondere Bedeutung und muss nicht entkommen werden, im Gegensatz zu einer doppelten Zeichenfolge. Ansonsten sind sie im Wesentlichen identisch.
  2. ^ "Zitieren" beinhaltet Flucht, also wenn \ Eof wird verwendet, dies wird zitiert, so dass eine variable Interpolation nicht auftritt und mit endet mit Eof, während wenn \\ eof wird verwendet, dies wird zitiert und endet mit \ Eof. Dieses vielleicht überraschende Verhalten kann in einer Hülle leicht implementiert werden, und der Tokenizer, der einfach ein Token aufzeichnet, wurde zitiert (während der Bewertungsphase von lexikalische Analyse), ohne den ursprünglichen, zitierten Wert zu bewahren.
    Eine Anwendung ist zu verwenden \ ' als Starttrainer und so ' Als Endtrennzeichen, der einem multiline Saitenliteral ähnelt, aber Start- und Endleitungsausbrüche strikt.
  3. ^ Beachten Sie, dass die Registerkarten zwar normalerweise in Editoren eingegeben werden können, in der Befehlszeile normalerweise eingegeben werden Strg+V + Tab ↹ Stattdessen wegen von Registerkartenabschlussund in dem Beispiel sind es tatsächliche Registerkarten, sodass das Beispiel kopiert und eingefügt werden kann.

Externe Links