Из Википедии, бесплатной энциклопедии
  (Перенаправлено из переменной интерполяции )
Перейти к навигации Перейти к поиску

В компьютерном программировании , интерполяциях строк (или переменной интерполяции , подстановках переменных или переменного расширении ) представляет собой процесс оценки в строке буквальной , содержащие один или несколько заполнителей , что дает результат , в котором заполнители заменены соответствующих их значения. Это форма простой обработки шаблона [1] или, формально, форма квазицитирования (или интерпретации логической подстановки ). Интерполяция строк обеспечивает более простое и интуитивно понятное форматирование строк и спецификацию содержимого по сравнению со строкой.конкатенация . [2]

Интерполяция строк распространена во многих языках программирования, которые интенсивно используют строковые представления данных, таких как Apache Groovy , Kotlin , Perl , PHP , Python , Ruby , Scala , Swift , Tcl и большинство оболочек Unix . Обычно предлагаются два режима буквального выражения: один с включенной интерполяцией, другой без (так называемая необработанная строка ). Заполнители обычно представлены пустой или именованной сигилой (обычно $или %), например, $placeholderили%123. Расширение строки обычно происходит во время выполнения .

Варианты [ править ]

Некоторые языки не предлагают интерполяцию строк, вместо этого предлагают стандартную функцию, в которой один параметр является строкой формата printf , а другие предоставляют значения для каждого заполнителя.

Ruby использует #символ для интерполяции и позволяет интерполировать любое выражение, а не только переменные. Другие языки могут поддерживать более продвинутую интерполяцию со специальной функцией форматирования, например printf, в которой первый аргумент, формат , указывает шаблон, в котором подставляются остальные аргументы.

Алгоритмы [ править ]

Существует два основных типа алгоритмов расширения переменных для интерполяции переменных : [3]

  1. Заменить и развернуть заполнители : создание новой строки из исходной с помощью операций поиска-замены. Найдите ссылку на переменную (заполнитель), замените ее значением переменной. Этот алгоритм не предлагает стратегии кэширования.
  2. Разделить и объединить строку : разделение строки на массив и объединение его с соответствующим массивом значений; затем соедините элементы конкатенацией. Разделенную строку можно кэшировать для повторного использования.

Проблемы безопасности [ править ]

Интерполяция строк, как и конкатенация строк, может привести к проблемам с безопасностью. Если вводимые пользователем данные неправильно экранированы или отфильтрованы, система будет подвержена атакам SQL-инъекций , сценариев , XML- инъекций внешних сущностей (XXE) и межсайтовых сценариев (XSS). [4]

Пример SQL-инъекции:

query = " "SELECT x, y, z FROM Table WHERE id='$id'

Если $idзаменить на " "'; DELETE FROM Table; SELECT * FROM Table WHERE id=' , выполнение этого запроса приведет к удалению всех данных в таблице.

Примеры [ править ]

Следующий код Perl идентично работает в PHP :

$ name  =  "Алиса" ; print  "$ {name} сказал" Привет, мир толпе ". ;

производит вывод: Alice said Hello World to the crowd of people.

ABAP [ править ]

ДАННЫЕ ( яблоки )  =  4 . НАПИСАТЬ  | У меня есть {  яблоки  } яблок |.

Результатом будет:

У меня 4 яблока

Баш [ править ]

apples = 4 echo  "У меня $ apples apples" # или echo  "У меня есть яблоки $ { apples } "

Результатом будет:

У меня 4 яблока

Бу [ править ]

apples  =  4 print ( "У меня есть $ (яблоки) яблоки" ) # или print ( "У меня есть {0} яблоки"  %  яблоки )

Результатом будет:

У меня 4 яблока

C # [ править ]

вар  яблок  =  4 ; var  bananas  =  3 ;Консоль . WriteLine ( $ "У меня есть {яблоки} яблоки" ); Консоль . WriteLine ( $ "У меня есть {яблоки + бананы} фрукты" );

[5]

Результатом будет:

У меня 4 яблокаУ меня 7 фруктов

Язык разметки ColdFusion [ править ]

Синтаксис скрипта языка разметки ColdFusion (CFML):

яблоки  =  4 ; writeOutput ( «У меня # яблоки # яблоки» );

Синтаксис тега:

<cfset  apples  =  4 > <cfoutput> У меня # яблоко # яблоко </cfoutput>

Результатом будет:

У меня 4 яблока

CoffeeScript [ править ]

яблоки = 4 консоли . log  "У меня есть # { яблок } яблок"

Результатом будет:

У меня 4 яблока

Дротик [ править ]

int  яблок  =  4 ,  бананов  =  3 ; print ( 'У меня есть яблоки $ apples.' ); print ( 'У меня есть фрукты $ {яблоки + бананы}.' );

Результатом будет:

У меня 4 яблока.У меня 7 фруктов.

Перейти [ править ]

lang  : =  Яблоки "Голанг" : = 3 фута . Println ( fmt . Sprintf ( "Я разработчик% s." , Lang )) fmt . Println ( fmt . Sprintf ( "У меня% d яблок." , Яблоки ))    

Результатом будет:

Я разработчик Golang.У меня 3 яблока.

Groovy [ править ]

В Groovy интерполированные строки известны как GStrings:

def  quality  =  "superhero" final  age  =  52 def  предложение  =  "Разработчик - это $ quality, если ему $ {age <= 42?" молодой ":" опытный "}" println  предложение

Результатом будет:

Разработчик - супергерой, если он закален

Haxe [ править ]

вар яблок =  4 ; var bananas =  3 ; trace ( 'У меня есть яблоки $ apples.' ); trace ( 'У меня есть фрукты $ { яблоки + бананы } .' );

Результатом будет:

У меня 4 яблока.У меня 7 фруктов.

[6]

Java [ править ]

Не имея истинных интерполированных строк, Java использует вспомогательные функции в качестве временного решения.

В версиях Java 5 и выше String.formatдля интерполяции можно использовать статический метод :

int  apples  =  4 ; int  bananas  =  3 ; Система . из . println ( String . format ( «У меня есть% s яблоки и% s бананы» ,  яблоки ,  бананы )); Система . из . println ( String . format ( «У меня% s фрукт» ,  яблоки  +  бананы ));

В Java версии 1.1 и выше MessageFormatкласс может форматировать наборы объектов с помощью заполнителей:

Объект []  testArgs  =  { Длинный . valueOf ( 3 ),  "MyDisk" };MessageFormat  form  =  new  MessageFormat (  "Диск \" {1} \ "содержит {0} файла (ов)." );Система . из . Println ( форма . формат ( testArgs ));

JavaScript [ править ]

JavaScript , как и стандарт ECMAScript 2015 (ES6), поддерживает интерполяцию строк с использованием обратных кавычек ``. Эта функция называется литералами шаблона . [7] Вот пример:

вар  яблок  =  4 ; var  bananas  =  3 ; консоль . журнал ( `У меня есть $ { apples } яблоки` ); консоль . журнал ( `У меня $ { яблоки  +  бананы } фрукты` );

Результатом будет:

У меня 4 яблокаУ меня 7 фруктов

Юлия [ править ]

яблоки  =  4 бананов  =  3 печати ( « У меня есть $ яблок яблок и $ бананов бананы, делая $ ( яблоки  +  бананы ) кусочки фруктов в общей сложности.» )

Результатом будет:

У меня 4 яблока и 3 банана, всего получается 7 фруктов.

Котлин [ править ]

val  quality  =  "superhero" val  apples  =  4 val  bananas  =  3 val  предложение  =  "Разработчик - это $ quality . У меня есть фрукты $ { apples  +  bananas } " println ( предложение )

Результатом будет:

Разработчик - супергерой. У меня 7 фруктов

Немерле [ править ]

def  яблоки  =  4 ; def  бананы  =  3 ; Консоль . WriteLine ( $ "У меня есть $ apples apples." ); Консоль . WriteLine ( $ "У меня есть фрукты $ (яблоки + бананы)." );

Он также поддерживает расширенные функции форматирования, такие как:

def  fruit  =  [ "яблоко" ,  "банан" ]; Консоль . WriteLine ( $ < # У меня есть .. $ (fruit; "\ n"; f => f + "s") #>);

Результатом будет:

яблокибананы

Оболочка нового поколения [ править ]

Тем не ${expr}менее, рекомендованный синтаксис $varтакже поддерживается:

quality  =  "superhero" apples  =  4 банана  =  3 предложения  =  "Разработчик - это $ quality . У меня есть фрукты $ { apples + bananas } "
echo ( предложение )

Результатом будет:

Разработчик - супергерой. У меня 7 фруктов

Ним [ править ]

Nim обеспечивает интерполяцию строк через модуль Strutils. Форматированные строковые литералы, вдохновленные F-строкой Python, предоставляются через модуль strformat, макрос strformat проверяет, правильно ли сформирована и типизирована строка форматирования, а затем расширяется в исходный код Nim во время компиляции.

import  Strutils ,  strformat var  apples  =  4 var  bananas  =  3 echo  "У меня есть яблоки за 1 доллар " . format ( яблоки ) echo  fmt "У меня есть {яблоки} яблоки" echo  fmt "У меня есть {яблоки + бананы} фрукты"# Многострочный echo  fmt " " "У меня  есть  { яблоки }  яблоки" ""# Отладка форматирования echo  fmt "У меня есть {apples =} яблоки"# Пользовательские символы openChar и closeChar echo  fmt ( "У меня есть (яблоки) {яблоки}" ,  '(' ,  ')' )# Обратная косая черта внутри форматированного строкового литерала echo  fmt " " " {" yep \ nope "} " " "

Результатом будет:

У меня 4 яблокаУ меня 4 яблокаУ меня 7 фруктову меня есть4 яблокаУ меня яблоки = 4 яблокаУ меня 4 {яблока}Агаопе

ParaSail [ править ]

const  Яблоки  : =  4 const  Бананы  : =  3 Println  ( "У меня есть` (Яблоки) яблоки. \ n " ) Println  ( " У меня есть фрукты `(Яблоки + Бананы). \ n" )

Результатом будет:

У меня 4 яблока.У меня 7 фруктов.

Perl [ править ]

мои  яблоки  =  4 ; мои  бананы $  =  3 ; print  "У меня есть яблоки $ apples. \ n" ; print  "У меня есть фрукты @ {[$ apples + $ bananas]}. \ n" ;  # Использует интерполяцию массива Perl (@).

Результатом будет:

У меня 4 яблока.У меня 7 фруктов.

PHP [ править ]

<? php $ apples  =  5 ; бананы  =  3 ; echo  "Есть $ яблоки яблоки и $ бананы бананы." ; эхо  " \ п " ; echo  "У меня есть яблоки $ { apples } и бананы $ { bananas } ." ;

Результатом будет:

Есть 5 яблок и 3 банана.У меня 5 яблок и 3 банана.

Python [ править ]

# во всех версиях apples  =  4 банана  =  3 print ( "У меня % d яблок и % d бананов"  %  ( яблоки ,  бананы ))  # больше не рекомендуется print ( "У меня есть % (яблоки) d яблоки и % (бананы) d bananas "  %  locals ())  # больше не рекомендуется # с Python 2.6+ print ( " У меня есть {0} яблоки и {1} бананы " . format ( apples,  bananas )) print ( "У меня есть {a} яблоки и {b} бананы" . format ( b = bananas ,  a = apples )) # с Python 2.7+ print ( "У меня есть {} яблоки и {} бананы" . format ( яблоки ,  бананы )) # или с Python 3.6+ print ( f "У меня есть { яблоки } яблоки и { бананы }бананы " )

[8] [9]

Результатом будет:

У меня 4 яблока и 3 банана

Рубин / Кристалл [ править ]

apples  =  4 помещает  "У меня # { apples } яблок" # или помещает  "У меня% s яблок"  %  apples # или помещает  "У меня% {a} яблоки"  %  { a :  apples }

Результатом будет:

У меня 4 яблока

Ржавчина [ править ]

Не имея истинных интерполированных строк, Rust предоставляет обходной путь через модуль std :: fmt , с которым взаимодействуют различные макросы, такие как format! , Запись! , и распечатайте! . Эти макросы преобразуются в исходный код Rust во время компиляции, при этом каждый аргумент взаимодействует с модулем форматирования . Средство форматирования поддерживает позиционные параметры , именованные параметры , типы аргументов и определение различных характеристик форматирования .

let ( яблоки , бананы ) = ( 4 , 3 );     println! ( "Есть {} яблоки и {} бананы." , Яблоки , бананы );  

Результатом будет:

Есть 4 яблока и 3 банана.

Scala [ править ]

В Scala 2.10+ реализованы следующие строковые интерполяторы: s, f и raw. Также можно написать собственные или заменить стандартные.

Интерполятор f - это макрос компилятора, который перезаписывает строку формата со встроенными выражениями как вызов String.format. Он проверяет, правильно ли сформирована и типизирована строка формата.

Стандартные интерполяторы [ править ]

Интерполяция строк в Scala 2.10+ позволяет встраивать ссылки на переменные непосредственно в обработанные строковые литералы. Вот пример:

val  apples  =  4 val  bananas  =  3 // до Scala 2.10 printf ( "У меня есть% d яблок \ n" ,  яблоки ) println ( "У меня% d яблоки"  формат  яблок ) // Scala 2.10+ println ( s "У меня есть $ apples apples " ) println ( s" У меня $ { apples  +  bananas } фрукты " ) println ( f" У меня есть $ apples % d apples " )

Результатом будет:

У меня 4 яблока

Sciter (текст) [ править ]

В Sciter любая функция с именем, начинающимся с $, считается интерполирующей функцией, поэтому интерполяция настраивается и зависит от контекста:

вар  яблок  =  4 вар  бананов  =  3 вар  domElement  =  ...;domElement . $ content ( < p > у меня  есть  { apples }  яблоки < / p>); domElement . $ append ( < p > У меня  есть  { яблоки  +  бананы }  фрукты < / p>);

Где

domElement. $ content (<p> У меня есть {яблоки} яблок </p>);

компилируется в это:

domElement . html  =  "<p> У меня есть"  +  яблоки . toHtmlString ()  +  «яблоки </p>» ;

Снобол [ править ]

 яблоки  =  4  ;  bananas  =  3  Output  =  "У меня"  яблоки  "яблоки."  Вывод  =  «У меня»  ( яблоки  +  бананы )  «фрукты».

Результатом будет:

У меня 4 яблока.У меня 7 фруктов.

Swift [ править ]

В Swift новое значение String можно создать из смеси констант, переменных, литералов и выражений, включив их значения в строковый литерал. Каждый элемент, вставленный в строковый литерал, заключен в пару круглых скобок с префиксом обратной косой черты.

let  apples  =  4 print ( "У меня \ (яблоки) яблоки" )

Результатом будет:

У меня 4 яблока

Tcl [ править ]

Язык команд инструментов всегда поддерживал интерполяцию строк во всех строках, разделенных кавычками.

набор яблок 4 ставит  "у меня $ яблоки яблоки".

Результатом будет:

У меня 4 яблока.

Чтобы фактически отформатировать, а не просто заменить значения, существует функция форматирования.

набор яблок 4 ставка  [ формат  «У меня% d яблок.»  $ apples ]

TypeScript [ править ]

Начиная с версии 1.4 TypeScript поддерживает интерполяцию строк с использованием обратных кавычек ``. Вот пример:

вар  яблок :  число  =  4 ; консоль . журнал ( `У меня есть $ { apples } яблоки` );

Результатом будет:

У меня 4 яблока

console.logФункция может быть использована в качестве printfфункции. Приведенный выше пример можно переписать следующим образом:

вар  яблок :  число  =  4 ; консоль . журнал ( "У меня% d яблок" ,  яблоки );

Результат остается прежним.

Visual Basic [ править ]

Начиная с Visual Basic 14, в Visual Basic поддерживается строковая интерполяция.

name  =  "Tom" Консоль . WriteLine ( $ "Привет, {имя}" )

напечатает «Привет, Том».

См. Также [ править ]

  • Конкатенация
  • Неправильная проверка ввода
  • строка формата printf
  • Квази-цитата
  • Строковый литерал
  • Замена

Заметки [ править ]

  1. ^ " Обеспечение строгого разделения представления модели и представления в механизмах шаблонов ", Т. Парр (2004), конференция WWW2004.
  2. ^ http://perlmeme.org/howtos/using_perl/interpolation.html
  3. ^ "Система наименьших-шаблонов / Простейшие алгоритмы" , интерактивное руководство по системам шаблонов-заполнителей.
  4. ^ http://google-caja.googlecode.com/svn/changes/mikesamuel/string-interpolation-29-Jan-2008/trunk/src/js/com/google/caja/interp/index.html#-autogen- id-1 Архивировано 19 октября 2012 г. в Wayback Machine
  5. ^ https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/#string-interpolation
  6. ^ «Haxe - Руководство - Строковая интерполяция» . Haxe - кроссплатформенный инструментарий . Проверено 12 сентября 2017 .
  7. ^ https://developer.mozilla.org/docs/Web/JavaScript/Reference/Template_literals
  8. ^ https://docs.python.org/3/whatsnew/3.0.html
  9. ^ https://www.python.org/dev/peps/pep-0498/