Här dokument

I datoranvändning är ett här-dokument ( här-dokument , här-text , härdok , här , här-sträng eller här-skript ) en fil- literal eller ingångsström -literal: det är en del av en källkodsfil som behandlas som om det var en separat fil . Termen används också för en form av flerradiga strängliteraler som använder liknande syntax, bevarar radbrytningar och andra blanksteg (inklusive indrag) i texten.

Här har dokument sitt ursprung i Unix-skalet , och finns i Bourne-skalet ( sh ), C-skalet ( csh ), tcsh ( tcsh ), KornShell ( ksh ), Bourne Again Shell ( bash ) och Z-skalet ( zsh ), bland annat andra. Här finns strängliteraler i dokumentstil i olika högnivåspråk , särskilt programmeringsspråket Perl (syntax inspirerad av Unix-skal) och språk påverkade av Perl, som PHP och Ruby . JavaScript stöder även denna funktion via mallliterals , en funktion som lades till i sin sjätte version ( ES6 ). Andra högnivåspråk som Python , Julia och Tcl har andra faciliteter för flerradiga strängar.

Här kan dokument behandlas antingen som filer eller strängar. Vissa skal behandlar dem som en formatsträng literal, vilket tillåter variabel substitution och kommandosubstitution inuti literal.

Den vanligaste syntaxen för här dokument, med ursprung i Unix-skal, är << följt av en avgränsande identifierare (ofta ordet EOF eller END ), följt, med början på nästa rad, av texten som ska citeras, och sedan avslutas av samma avgränsande identifierare på sin egen rad. Denna syntax beror på att dokument här formellt är strömlitterala, och innehållet i dokumentet omdirigeras till stdin (standardinmatning) för föregående kommando; dokumentsyntaxen här är analogt med syntaxen för ingångsomdirigering , som är < "ta input från följande fil".

Andra språk använder ofta väsentligen liknande syntax, men detaljer om syntax och faktisk funktionalitet kan variera avsevärt. När det bara används för strängliteraler << inte inriktning, utan är helt enkelt en startavgränsningskonvention. På vissa språk, som Ruby, << också för indataomdirigering, vilket resulterar i att << används två gånger om man vill omdirigera från en här dokumentsträng literal.

Fil bokstavliga

Snävt sett är dokument här filliteraler eller streamliteraler. Dessa har sitt ursprung i Unix-skalet, även om liknande faciliteter finns tillgängliga på några andra språk.

Unix-skal

Här finns dokument tillgängliga i många Unix-skal. I följande exempel skickas text till tr- kommandot (translitterera små bokstäver till versaler) med hjälp av ett here-dokument. Detta kan vara i en skalfil eller inmatas interaktivt vid en prompt.





 $  LANG  =  C tr az AZ << SLUT  > en två tre  > fyra fem sex  > SLUT EN  TVÅ TRE  FYRA FEM SEX 

END användes som avgränsande identifierare. Det specificerade början och slutet av här dokumentet. Omdirigeringen och den avgränsande identifieraren behöver inte separeras med ett mellanslag: <<END eller << END fungerar båda lika bra.

Som standard är beteendet i stort sett identiskt med innehållet i dubbla citattecken: variabelnamn ersätts med deras värden, kommandon inom backticks utvärderas, etc.



 $  cat << EOF  > \$ Working dir "$PWD" `pwd`  > EOF  $  Working dir  "/home/user"  /home/user 

Detta kan inaktiveras genom att citera valfri del av etiketten, som sedan avslutas med det icke-citerade värdet; beteendet är i huvudsak identiskt med det om innehållet var inneslutet i enstaka citattecken. Så till exempel genom att sätta det i enstaka citattecken:




 $  cat <<  'EOF'  > \$ Working dir "$PWD" `pwd`  > EOF  \$ Working dir "$PWD" `pwd` 

Dubbla citattecken kan också användas, men detta är föremål för förvirring, eftersom expansion sker i en sträng med dubbla citattecken, men inte i ett här dokument med dubbla citattecken. Enkel- och dubbelciterade avgränsare urskiljs på vissa andra språk, särskilt Perl (se nedan), där beteendet är parallellt med motsvarande strängcitat.

I POSIX-skalet, men inte csh/tcsh, har ett minustecken till << (dvs. <<- ) effekten att ledande flikar ignoreras. Detta tillåter indrag här dokument i skalskript (i första hand för anpassning till befintliga indrag) utan att ändra deras värde:

Ett skript som innehåller:













 LANG  =  C tr az AZ  <<- END_TEXT  Här dokument med <<-  Ett enstaka mellanslag (dvs. 0x20 ) är i början av denna rad.  Denna  rad börjar med ett enda TAB-tecken dvs 0x09 liksom nästa rad  END_TEXT  echo  slutet var före detta radeko  och  dessa behandlades inte av tr  echo  ++++++++++++++++  LANG  =  C tr az AZ  << END_TEXT  Här dokument med <<  Ett enstaka mellanslag (dvs. 0x20 ) är i början av denna rad.  Den här raden börjar med ett enda TAB-tecken dvs 0x09 liksom nästa rad  END_TEXT  echo  Det avsedda slutet var före denna rad,  echo  men eftersom raden med den avgränsande identifieraren började med en TAB kändes den INTE igen och  eka  tr  -kommandot  fortsatt bearbetning. 

producerar:

HÄR ÄR DOKUMENT MED <<- EN ENKEL MELLANSLAGSTECKEN (Dvs. 0X20 ) I BÖRJAN AV DENNA RAD DENNA RAD BÖRJAR MED EN ENKEL TABBTECKET IE 0X09 SOM GÖR NÄSTA RAD Det avsedda slutet var före denna rad och dessa behandlades inte av tr +++++++++++++++ HÄR DOKUMENT MED << EN ENKEL MELLANSLAGSTEcken (Dvs. 0X20 ) ÄR I BÖRJAN AV DEN HÄR RADEN DEN HÄR RADEN BÖRJAR MED EN ENKEL TABB-TECKEN Dvs. 0X09 SOM NÄSTA RAD. END_TEXT EKHO DET AVSEENDE SLUTTET VAR FÖRE DEN HÄR RADEN, EKHO MEN FÖR ATT LINJEN MED DET AVGRÄNSANDE IDENTIFIERN BÖRJADE MED EN FLIK KÄNDES DEN INTE IGEN OCH EKOTAR TR-KOMMANDOET.

En annan användning är att mata ut till en fil:




 $  cat << EOF > ~/testFile001  > 3 blanksteg före denna text.  > Ett enskilt tabbtecken finns i början av denna rad.  >Inget föregår denna text  EOF 

Här strängar

En here-sträng (tillgänglig i bash , ksh , eller zsh ) är syntaktiskt lik och består av <<< , och påverkar indataomdirigering från ett ord (en sekvens som behandlas som en enhet av skalet, i det här sammanhanget vanligtvis en bokstavlig sträng). I det här fallet används den vanliga skalsyntaxen för ordet ("här strängsyntax"), där den enda syntaxen är omdirigeringen: en här-sträng är en vanlig sträng som används för inmatningsomdirigering, inte en speciell typ av sträng.

Ett enda ord behöver inte citeras:

 $  LANG  =  C tr az AZ  <<<  en  EN 

Vid en sträng med mellanslag måste den citeras:

 
 $  LANG  =  C tr az AZ  <<<  'en två tre'  EN TVÅ TRE 

Detta kan också skrivas som:


 
 $  foo  =  'en två tre'  $  LANG  =  C tr az AZ  <<<  "  $foo  "  EN TVÅ TRE 

Flerlinjesträngar är acceptabla, vilket ger:

 

 $  LANG  =  C tr az AZ  <<<  '  en  > två tre' EN   TVÅ  TRE 

Observera att ledande och efterföljande nyrader, om sådana finns, ingår:

 







 $  LANG  =  C tr az AZ  <<<  '  > en  > två tre  > '  EN TVÅ  TRE  $ 

Den viktigaste skillnaden från dokumenten här är att i dokumenten är avgränsningarna på separata rader; de ledande och efterföljande nylinjerna tas bort. Till skillnad från här dokument, här använder inte strängar avgränsare.

Här är strängar särskilt användbara för kommandon som ofta tar kort inmatning, till exempel kalkylatorn bc :

  $  bc  <<<  2  ^10  1024 

Observera att strängbeteende här också kan åstadkommas (omvänd ordning) via rörledning och ekokommandot, som i:

    $  echo  'ett två tre'  |  LANG  =  C tr az AZ  ETT TVÅ TRE 

Men här är strängar särskilt användbara när det sista kommandot måste köras i den aktuella processen, vilket är fallet med inbyggd läs :

       $  echo  'ett två tre'  |  läs  -rabc  $  echo  "  $a  $b  $c  " 

ger ingenting, medan

 
   
 $  read  -rabc  <<<  'en två tre'  $  echo  "  $a  $b  $c  "  en två tre 

Detta händer eftersom rörledningar i det föregående exemplet gör att läsning körs i en underprocess, och som sådan inte kan påverka miljön för den överordnade processen.

Microsoft NMAKE

I Microsoft NMAKE hänvisas här till dokument som inline-filer . Inline-filer refereras till som << eller <<sökvägsnamn : den första notationen skapar en temporär fil, den andra notationen skapar (eller skriver över) filen med det angivna sökvägsnamnet. En inbäddad fil avslutas med << på en rad för sig själv, eventuellt följt av nyckelordet (skiftlägeskänsligt) KEEP eller NOKEEP för att indikera om den skapade filen ska behållas.

   



     


     


   

 target0  :  dependent  0 command0 <<  temporary  inline  file  ...  <<  target1  :  dependent  1 command1 <<  temporary,  but  beserved  inline  file  ...  <<KEEP 
 target2  :  dependent  2 command2 <<filnamn2  namngiven,  men  kasserad  inline  fil  ..  <<NOKEEP 
 mål3  :  beroende  3 kommando3 <<filnamn3  namngiven  inline  fil  ...  <<  KEEP 

R

R har inte filliteraler, men ger motsvarande funktionalitet genom att kombinera strängliterals med en sträng-till-fil-funktion. R tillåter godtyckliga blanksteg, inklusive nyrader, i strängar. En sträng kan sedan omvandlas till en filbeskrivning med hjälp av textConnection() -funktionen. Till exempel gör följande en datatabell inbäddad i källkoden till en dataramvariabel:

 





     str  <-  "Statens Befolkning Inkomst Analfabetism Liv.Exp Mord HS.Grad Frost  Alabama 3615 3624 2.1 69.05 15.1 41.3 20  Alaska 365 6315 1.5 69.31 11.3 66.7 212 5  Arizona. 7 212 54 Arizona. 58,1 15 Arkansas 2110 3378 1,9 70,66  10,1 39,9 65"  x  <-  read.table  (  textConnection  (  str  ),  header  =  TRUE  ,  row.names  =  1  ) 

Datasegment

Perl och Ruby har en form av fil literal, som kan betraktas som en form av datasegment . I dessa språk, inklusive raden __DATA__ (Perl) eller __END__ (Ruby, gamla Perl) markerar slutet på kodsegmentet och början på datasegmentet. Endast innehållet före denna rad exekveras, och innehållet i källfilen efter denna rad är tillgängligt som ett filobjekt: PACKAGE::DATA i Perl (t.ex. main::DATA ) och DATA i Ruby. Som en inline-fil liknar dessa semantiskt dokument här, även om det bara kan finnas en per skript. Men på dessa språk hänvisar termen "här dokument" istället till flerradssträngar, som diskuteras nedan.

Data URI-schema

Som ytterligare förklaras i Data URI-schema förstår alla större webbläsare URI:er som börjar med data: som här dokument.

Flerradiga strängar

Termen "här dokument" eller "här sträng" används också för flerradssträngar i olika programmeringsspråk, särskilt Perl (syntax påverkad av Unix-skal) och språk påverkade av Perl, särskilt PHP och Ruby. Skal-stilen <<- syntaxen behålls ofta, trots att den inte används för indataomdirigering.

Perl-influerad

Perl

I Perl finns det flera olika sätt att åberopa här docs. Avgränsningstecken runt taggen har samma effekt inom here-dokumentet som de skulle ha i en vanlig strängliteral: Om du till exempel använder dubbla citattecken runt taggen kan variabler interpoleras , men att använda enkla citattecken gör det inte, och att använda taggen utan antingen beter sig som dubbla citattecken. Genom att använda backticks som avgränsare runt taggen körs innehållet i heredoc som ett skalskript. Det är nödvändigt att se till att sluttaggen är i början av raden, annars kommer taggen inte att kännas igen av tolken.

Observera att här-dokumentet inte börjar vid taggen utan snarare börjar på nästa rad. Så uttalandet som innehåller taggen fortsätter efter taggen.

Här är ett exempel med dubbla citattecken:

   
   

 








 min  $sender  =  "Buffy the Vampire Slayer"  ;  min  $recipient  =  "Spike"  ;  skriv ut  <<"  END  ";  Kära $mottagare,  jag önskar att du lämnar Sunnydale och aldrig kommer tillbaka.  Not Quite Love,  $sender  END 

Produktion:

Kära Spike, jag önskar att du lämnar Sunnydale och aldrig kommer tillbaka. Not Quite Love, Buffy the Vampire Slayer

Här är ett exempel med enstaka citattecken:

 






 skriv ut  <<'  END  ';  Kära $mottagare,  jag önskar att du lämnar Sunnydale och aldrig kommer tillbaka.  Not Quite Love,  $sender  END 

Produktion:

Kära $mottagare, jag önskar att du lämnar Sunnydale och aldrig kommer tillbaka. Not Quite Love, $sender

Och ett exempel med backticks (kanske inte är portabel):

   
 
 
 min  $shell_script_stdout  =  <<  `SLUT`  ;  echo  foo  echo  bar  END 

Det är möjligt att starta flera heredocs på samma rad:

    
   

    



 säga  (  <<  BEGIN  .  "detta är mitten\n"  .  <<  END  );  Detta  är  början  :  BÖRJA  Och  nu  är  det  över  !  END  # detta motsvarar:  säg  (  "Detta är början:\ndet här är mitten\nOch nu är det över!\n" )  ; 

Själva taggen kan innehålla blanksteg, vilket kan göra att heredocs kan användas utan att bryta indrag .

   
 
   säg  <<  'SLUT'  ;  Hej  världen  END 

Även sedan Perl version 5.26 kan heredocs inkludera indrag:

        
          
           
             
            
         #prints "Hej där\n" utan inledande blanksteg.  if  (  1  )  {  print  <<~  EOF  ;  Hej  där  EOF  } 

Utöver dessa strängar har Perl också fil-literals, nämligen innehållet i filen som följer __DATA__ (tidigare __END__ ) på en rad för sig. Detta är tillgängligt som filobjektet PACKAGE::DATA såsom main::DATA , och kan ses som en form av datasegment .

PHP

I PHP kallas här dokument för heredocs . I PHP är heredocs inte bokstavliga strängar. Heredoc-text beter sig precis som en sträng med dubbla citattecken, men utan dubbla citattecken. Till exempel, betyder `$` kommer att tolkas som en variabel start, och `${` eller `{$` som en komplex variabel start.


 
        
  
 








  




 

 <?php  $name  =  "Joe Smith"  ;  $occupation  =  "Programmerare"  ;  echo  <<<  EOF  Detta är en heredoc-sektion.  För mer information prata med $name, din lokala $ockupation.  Tack!  EOF  ;  $toprint  =  <<<  EOF  Hej $namn! Du kan faktiskt tilldela heredoc-sektionen till en variabel!   EOF  ;  echo  $toprint  ;  ?> 

Utgångar

Detta är ett heredoc-avsnitt. För mer information prata med Joe Smith, din lokala programmerare. Tack! Hej Joe Smith! Du kan faktiskt tilldela heredoc-sektionen till en variabel!

I PHP-versioner före 7.3 får raden som innehåller den avslutande identifieraren inte innehålla några andra tecken, förutom ett valfritt slutsemikolon. Annars kommer det inte att anses vara en avslutande identifierare, och PHP kommer att fortsätta leta efter en. Om en korrekt stängningsidentifierare inte hittas, kommer ett analysfel att resultera på den sista raden i skriptet. Men från version 7.3 krävs det inte längre att den avslutande identifieraren följs av semikolon eller nyrad. Dessutom kan den avslutande identifieraren dras in, i vilket fall indraget tas bort från alla rader i dokumentsträngen.

I PHP 5.3 och senare, liksom Perl, är det möjligt att inte interpolera variabler genom att omge taggen med enstaka citattecken; detta kallas nudoc :

  






 $x  =  <<<'  END  '  Kära $mottagare,  jag önskar att du lämnar Sunnydale och aldrig kommer tillbaka.  Not Quite Love,  $sender  END  ; 

I PHP 5.3+ är det också möjligt att omge taggen med dubbla citattecken, vilket liksom Perl har samma effekt som att inte omge taggen med någonting alls.

Rubin

Följande Ruby-kod visar en inköpslista genom att använda ett här-dokument.

 






 

 sätter  <<  GROCERY_LIST  Inköpslista  ----  1. Salladsmix.  2. Jordgubbar.*  3. Spannmål.  4. Mjölk.*  * Ekologisk  LISTA 

Resultatet:







 
 $  ruby ​​grocery-list.rb  Inköpslista  ------------  1. Salladsmix.  2. Jordgubbar.*  3. Spannmål.  4. Mjölk.*  * Ekologisk 

<< i ett här-dokument indikerar inte omdirigering av inmatning, men Ruby använder också << för omdirigering av indata , så att omdirigera till en fil från ett här-dokument innebär att << används två gånger, i olika betydelser:

   
    






 


 File  ::  öppna  (  "grocery-list"  ,  "w"  )  gör  |  f  |  f  <<  <<  GROCERY_LIST  Inköpslista  ----  1. Salladsmix.  2. Jordgubbar.*  3. Spannmål.  4. Mjölk.*  * Ekologisk  GROCERY_LIST  slut 

Precis som med Unix-skal tillåter Ruby också att den avgränsande identifieraren inte startar på den första kolumnen på en rad, om början av här-dokumentet är markerad med den något annorlunda startpunkten << - . Dessutom behandlar Ruby här dokument som en sträng med dubbla citat, och som sådan är det möjligt att använda #{}- konstruktionen för att interpolera kod. Följande exempel illustrerar båda dessa funktioner:

  
 

 nu  =  Tid  .  nu  sätter  <<-  EOF  Det är #{now.hour} klockan John, var är dina barn?  EOF 

Ruby utökar detta genom att tillhandahålla "<<~"-syntaxen för att utelämna indrag i här-dokumentet:

 



 sätter  <<~  EOF  Denna rad är indragen två blanksteg.  Denna rad är indragen fyra blanksteg.  Denna rad är indragen sex mellanslag.  EOF 

Den gemensamma indragningen av två mellanslag utelämnas från alla rader:



 $  ruby ​​indented-heredoc.rb  Den här raden är indragen två blanksteg.  Denna rad är indragen fyra blanksteg.  Denna rad är indragen sex mellanslag. 

Precis som Perl tillåter Ruby att starta flera här dokument på en rad:

     






  sätter  <<  BEGIN  +  "<--- mitten --->  \n  "  +  <<  END  Detta är början:  BEGIN  Och nu är det över!  END  # detta motsvarar detta uttryck:  sätter  "Detta är början:  \n  <--- mitten --->  \n  Och nu är det över!" 

Precis som med Perl har Ruby filbokstavar, nämligen innehållet i filen som följer __END__ på en rad för sig. Detta är tillgängligt som filobjektet DATA och kan ses som en form av datasegment .

Pytonorm

Python stöder flerradiga strängar som en "ordagrant" sträng. De kan omges av 3 enkla (') eller dubbla (") citattecken, det senare visas i exemplen nedan.




 print  (  """  Kund: Inte mycket av en ostaffär är det?  Handlare: Finast i distriktet, sir. ""  "  ) 

Från Python 3.6 och framåt stöder ordagrant f-strängar variabel- och uttrycksinterpolation.

  
  



 shop_type  =  "OST"  utmärkelse  =  "finaste"  tryck  (  f  """  Kund: Inte mycket av en  {  shop_type  .  lägre  ()  }  butik är det?  Handlare:  {  utmärkelse  .  kapitalisera  ()  }  i distriktet, sir.  "" "  ) 

C++

Eftersom C++11 stöder C++ strängliteraler med anpassad avgränsare ("my_delimiter" i det här exemplet):

 

    

     #include  <ostream>  const  char  *  str  =  R  "  my_delimiter(  Start av sträng. Ny rad  snedstreck \ quote " ' parens ) ( End of string  )my_delimiter  "  ;  std  ::  cout  <<  str  <<  std  ::  endl  ; 

kommer att skriva ut

Start av sträng. Ny rad snedstreck \ quote " ' parens ) ( Slut på sträng

D

Sedan version 2.0 har D stöd för här dokumentliknande strängar som använder prefixet 'q'. Dessa strängar börjar med q"IDENT följt omedelbart av en ny rad (för en godtycklig identifierare IDENT), och slutar med IDENT" i början av en rad.

  
       




      
 int  main  ()  {  string  list  =  q  "IDENT  1. Item One  2. Item Two  3. Item Three  IDENT"  ;  writef  (  lista  );  } 

D stöder också några citerande avgränsare, med liknande syntax, med sådana strängar som börjar med q"[ och slutar med ]" eller liknande för andra avgränsare (någon av () <> {} eller []).

OS/JCL

På IBM:s Job Control Language (JCL) som används på dess tidigare MVS och nuvarande z/OS operativsystem, kan data som är inline i en jobbström identifieras med en * på en DD-sats, som // SYSIN DD * eller // SYSIN DD * , DLM = text I det första fallet följer textraderna och kombineras till en pseudofil med DD-namnet SYSIN. Alla poster som följer kommandot kombineras tills antingen ett annat OS/JCL-kommando inträffar (valfri rad som börjar med // ), standard EOF- sekvensen ( /* ) hittas eller det fysiska slutet av data inträffar. I det andra fallet är villkoren desamma, förutom att DLM=-operanden används för att ange textsträngens signaleringsslut på data, som kan användas om en dataström innehåller JCL (återigen, vilken rad som helst som börjar med // ) , eller /*- sekvensen (som kommentarer i C eller C++ källkod). Följande kompilerar och exekverar ett assemblerspråksprogram, som tillhandahålls som in-line-data till assemblern.

  
      






 //  AHAR  JOBB  (  'ALEX HARRIS'  )  //  EXEC  ASMLG  //  SYSIN  DD  *  APROG START  XR 15,15  BR 14  END  /*  //* JOBB SLUTAR 

// SYSIN DD * -satsen är den funktionella motsvarigheten till <</* Indikerar s ström av data följer, avslutad av /* .

Racket

Rackets här strängar börjar med #<< följt av tecken som definierar en terminator för strängen. Innehållet i strängen inkluderar alla tecken mellan #<<- raden och en rad vars enda innehåll är den angivna terminatorn. Närmare bestämt börjar innehållet i strängen efter en ny rad efter #<< , och den slutar före en ny rad som följs av terminatorn.




 





  #lang  racket  (  displayln  #<<HERESTRING  Detta är en enkel här sträng i Racket.  * En  * Två  * Tre  HERESTRING  ) 

Utgångar:

Detta är en enkel här sträng i Racket. * Ett två tre

Inga flyktsekvenser känns igen mellan start- och slutlinjerna; alla tecken ingår i strängen (och terminatorn) bokstavligen.




 






  #lang  racket  (  displayln  #<<En här sträng i Racket ☺  Denna sträng sträcker sig över flera rader  och kan innehålla vilken Unicode-symbol som helst.  Så saker som λ, ☠, α, β, är alla bra.  På nästa rad kommer terminatorn. Den kan också innehålla vilken Unicode-symbol som helst, även mellanslag och smileys!  En här sträng i Racket ☺  ) 

Utgångar:

Denna sträng sträcker sig över flera rader och kan innehålla vilken Unicode-symbol som helst. Så saker som λ, ☠, α, β är alla bra. På nästa rad kommer terminatorn. Den kan också innehålla vilken Unicode-symbol som helst, även mellanslag och smileys!

Här kan strängar användas normalt i sammanhang där normala strängar skulle:



 







        
        
         #lang  racket  (  printf  #<<END  Bästa ~a,  Tack för det insiktsfulla samtalet ~a.  ~a  SLUT  "Isaac" "  igår"  "Carl"  ) 

Utgångar:

Kära Isaac, Tack för det insiktsfulla samtalet igår. Carl

Ett intressant alternativ är att använda språktillägget at-exp för att skriva @-uttryck. De ser ut så här:

  #lang  at-exp  racket  (displayln @string-append{ Detta är en lång sträng, mycket bekvämt när en lång bit text behövs. Inga bekymmer om att undkomma "citattecken" eller \escapes. Det är också okej att ha λ, γ, θ, ... Bädda in kod:     @  (  nummer->sträng  (  +  3  4  ))  }) 

Utgångar:

Detta är en lång sträng, mycket bekvämt när en lång bit text behövs. Inga bekymmer om att undkomma "citat" eller \escapes. Det är också okej att ha λ, γ, θ, ... Bädda in kod: 7

Ett @-uttryck är inte specifikt eller begränsat till strängar, det är en syntaxform som kan komponeras med resten av språket.

Windows PowerShell

I PowerShell hänvisas här till dokument som här-strängar . En här-sträng är en sträng som börjar med en öppen avgränsare ( @" eller @' ) och slutar med en nära avgränsare ( "@ eller '@ ) på en rad för sig, som avslutar strängen. Alla tecken mellan öppna och stängda avgränsare anses vara strängen bokstavlig. Att använda en här-sträng med dubbla citattecken tillåter att variabler tolkas , att använda enkla citattecken gör det inte. Variabelinterpolation sker med enkla variabler (t.ex. $x men INTE $xy eller $x[0] ) . Du kan köra en uppsättning satser genom att lägga dem i $() (t.ex. $($xy) eller $(Get-Process | Out-String) ) .

I följande PowerShell-kod skickas text till en funktion med hjälp av en här-sträng. Funktionen Konvertera till versaler definieras enligt följande:

    
 
 




 PS >  funktion  Konvertera till versaler  (  $string  )  {  $string  .  ToUpper  ()  }  PS >  KonverteraTill versaler  @  '  >> en två tre  >> eins zwei drei  >> '@  EN TVÅ TRE  EINS ZWEI DREI 

Här är ett exempel som visar variabel interpolation och satsexekvering med hjälp av en here-sträng med dubbla citattecken:

    
  
    













 PS >  $doc  ,  $marty  =  'Dr. Emmett Brown'   ,  'Marty McFly'  PS >  $time  =  [DateTime]  'Freday, October 25, 1985 8:00:00 AM'  PS >  $diff  =  New-TimeSpan  -Minutes  25  PS >  @"  >> $doc : Är det mina klockor jag hör?  >> $marty : Ja! Äh, klockan är $($time.Hour)!  >> $doc : Perfekt! Mitt experiment fungerade! De är alla exakt $($diff.Minutes ) minuter långsamt.  >> $marty : Vänta en minut. Vänta en minut. Doc... Säger du mig att det är $(($time + $diff).ToShortTimeString())? >> $doc : Exakt  .  > > $marty: Fan! Jag är sen till skolan!  >> "@  Dr. Emmett Brown: Är det mina klockor jag hör?  Marty McFly: Ja! Äh, klockan är 8!   Dr. Emmett Brown: Perfekt! Mitt experiment fungerade!  De är alla exakt 25 minuter långsamma.   Marty McFly: Vänta lite. Vänta en minut.  Doc... Säger du mig att klockan är 08:25?   Dr Emmett Brown: Precis.  Marty McFly: Fan! Jag är sen till skolan!  

Om du använder en här-sträng med enkla citattecken istället, skulle utdata se ut så här:














 PS >  @  '  >> $doc : Är det mina klockor jag hör?  >> $marty: Ja! Äh, klockan är $($time.Hour)!   >> $doc : Perfekt! Mitt experiment fungerade!  De är alla exakt $($diff.Minutes) minuter långsamma.   >> $marty : Vänta lite. Vänta en minut.  Doc... Säger du mig att det är $(($time + $diff).ToShortTimeString())?   >> $doc : Precis.  >> $marty: Fan! Jag är sen till skolan!   >> '@  $doc : Är det mina klockor jag hör?  $marty: Ja! Äh, klockan är $($time.Hour)!   $doc: Perfekt! Mitt experiment fungerade!  De är alla exakt $($diff.Minutes) minuter långsamma.   $marty: Vänta lite. Vänta en minut.  Doc... Säger du mig att det är $(($time + $diff).ToShortTimeString())?   $doc: Precis.  $marty: Fan! Jag är sen till skolan!  

DIGITAL Command Language (DCL)

I DCL-skript behandlas alla inmatningsrader som inte börjar med en $-symbol implicit som indata till föregående kommando - alla rader som inte börjar med $ är här-dokument. Indata skickas antingen till programmet eller kan uttryckligen refereras till med det logiska namnet SYS$INPUT (analogt med Unix-konceptet stdin ).

Om du till exempel uttryckligen hänvisar till ingången som SYS$INPUT:




 $  TYPE SYS  $INPUT  Denna text kommer att ekas direkt  till skärmen av kommandot TYPE.  $  ! andra kommandon...  

producerar:

Denna text kommer att ekas direkt till skärmen av kommandot TYPE.

Dessutom kan kommandot DECK, som ursprungligen var avsett för stöd för hålkort (därav dess namn: det betecknade början på ett datakort ) användas för att ge indata till föregående kommando. Inmatningsdäcket avslutas antingen med kommandot $ EOD eller teckenmönstret som specificeras av parametern /DOLLARS till DECK.

Exempel på ett program som summerar pengar:

$ RUN ADD_SUMS.EXE $ DECK $13.53 $3.33 $2.33 $ EOD

Skulle producera följande utdata (förutsatt att ADD_SUMS skrevs för att läsa värdena och lägga till dem):

19,19 USD

Exempel på att använda DECK /DOLLARS för att skapa en kommandofil från en annan:





 $  COPY SYS  $INPUT  SYS  $SCRATCH  :TEMP.COM  $  DECK /DOLLARS  =  $$$$  $  TYP SYS  $INPUT  Detta är ett exempel på hur du använder DECK för att skapa  en kommandofil inifrån en kommandofil  $  $$  $  $  ! andra kommandon följer ...  

YAML

YAML förlitar sig i första hand på blankstegsindragning för struktur, vilket gör den motståndskraftig mot kollision med avgränsare och kan representera flerradiga strängar med vikta strängar:


      
    
 
        
 

        
        
           
        
         ---  caption  :  "Exempel  heredoc-liknande  funktionalitet  med  YAML"  date  :  "2007-06-01"  exempel  :  >  HTML går in i YAML utan  ändringsmeddelande  :  |  <blockquote style="font: italic 12pt Times">  <p>"Tre är alltid större än två,  även för stora värden på två"</p>  <p>--Okänd författare</p>  </blockquote> 

Se även

Allmän

externa länkar