En programación informática , la interpolación de cadenas (o interpolación de variables , sustitución de variables o expansión de variables ) es el proceso de evaluar un literal de cadena que contiene uno o más marcadores de posición , lo que produce un resultado en el que los marcadores de posición se reemplazan con sus valores correspondientes. Es una forma de procesamiento de plantilla simple [1] o, en términos formales, una forma de cuasi-cita (o interpretación de sustitución lógica ). La interpolación de cadenas permite un formato de cadena y una especificación de contenido más fáciles e intuitivos en comparación con la cadenaconcatenación . [2]
La interpolación de cadenas es común en muchos lenguajes de programación que hacen un uso intensivo de representaciones de cadenas de datos, como Apache Groovy , Kotlin , Perl , PHP , Python , Ruby , Scala , Swift , Tcl y la mayoría de los shells de Unix . Por lo general, se ofrecen dos modos de expresión literal: uno con la interpolación habilitada y el otro sin (denominada cadena sin procesar ). Los marcadores de posición suelen estar representados por un sigilo desnudo o con nombre (típicamente $
o %
), por ejemplo, $placeholder
o %123
. La expansión de la cadena suele producirse en tiempo de ejecución .
Variaciones
Algunos lenguajes no ofrecen interpolación de cadenas, sino que ofrecen una función estándar en la que un parámetro es la cadena de formato printf y otros proporcionan los valores para cada marcador de posición.
Ruby usa el #
símbolo para la interpolación y permite interpolar cualquier expresión, no solo variables. Otros lenguajes pueden admitir una interpolación más avanzada con una función de formato especial, como printf
, en la que el primer argumento, el formato , especifica el patrón en el que se sustituyen los argumentos restantes.
Algoritmos
Hay dos tipos principales de algoritmos de expansión de variables para la interpolación de variables : [3]
- Reemplazar y expandir marcadores de posición : creando una nueva cadena a partir de la original, mediante operaciones de búsqueda y reemplazo. Encuentre referencia de variable (marcador de posición), reemplácelo por su valor de variable. Este algoritmo no ofrece ninguna estrategia de caché.
- Dividir y unir cadena : dividir la cadena en una matriz y fusionarla con la correspondiente matriz de valores; luego une elementos por concatenación. La cadena dividida se puede almacenar en caché para reutilizarla.
Temas de seguridad
La interpolación de cadenas, como la concatenación de cadenas, puede provocar problemas de seguridad. Si los datos de entrada del usuario se escapan o filtran incorrectamente, el sistema estará expuesto a ataques de inyección SQL , inyección de scripts , inyección de entidad externa XML (XXE) y scripts entre sitios (XSS). [4]
Un ejemplo de inyección SQL:
consulta = " "SELECT x, y, z FROM Table WHERE id='$id'
Si $id
se reemplaza por " "';
, la ejecución de esta consulta borrará todos los datos de la Tabla.DELETE FROM Table; SELECT * FROM Table WHERE id='
Ejemplos de
El siguiente código de Perl funciona de manera idéntica en PHP :
$ nombre = "Alice" ; print "$ {name} dijo Hola mundo a la multitud de personas". ;
produce la salida: Alice said Hello World to the crowd of people.
ABAP
DATOS ( manzanas ) = 4 . ESCRIBIR | Tengo { manzanas } manzanas |.
La salida será:
Tengo 4 manzanas
Intento
manzanas = 4 echo "Tengo $ manzanas manzanas" # o echo "Tengo $ { manzanas } manzanas"
La salida será:
Tengo 4 manzanas
Abucheo
manzanas = 4 print ( "Tengo $ (manzanas) manzanas" ) # o print ( "Tengo {0} manzanas" % manzanas )
La salida será:
Tengo 4 manzanas
C#
var manzanas = 4 ; var bananas = 3 ;Consola . WriteLine ( $ "Tengo {manzanas} manzanas" ); Consola . WriteLine ( $ "Tengo {manzanas + plátanos} frutas" );
La salida será:
Tengo 4 manzanasTengo 7 frutas
Lenguaje de marcado ColdFusion
Sintaxis del script ColdFusion Markup Language (CFML):
manzanas = 4 ; writeOutput ( "Tengo # manzanas # manzanas" );
Sintaxis de la etiqueta:
manzanas = 4 > Tengo # manzanas # manzanas
La salida será:
Tengo 4 manzanas
CoffeeScript
manzanas = 4 consola . log "Tengo # { manzanas } manzanas"
La salida será:
Tengo 4 manzanas
Dardo
int manzanas = 4 , plátanos = 3 ; print ( 'Tengo $ manzanas manzanas' ); print ( 'Tengo $ {manzanas + plátanos} fruta.' );
La salida será:
Tengo 4 manzanas.Tengo 7 frutas.
Ir
lang : = manzanas "Golang" : = 3 fmt . Println ( fmt . Sprintf ( "Soy desarrollador% s." , Lang )) fmt . Println ( fmt . Sprintf ( "Tengo% d manzanas" , manzanas ))
La salida será:
Soy un desarrollador de Golang.Tengo 3 manzanas.
Groovy
En groovy, las cadenas interpoladas se conocen como GStrings:
def calidad = "superhéroe" edad final = 52 def sentencia = "Un desarrollador es una $ calidad, si tiene $ {edad <= 42?" joven ":" experimentado "}" frase impresa
La salida será:
Un desarrollador es un superhéroe si tiene experiencia
Haxe
var manzanas = 4 ; var bananas = 3 ; trace ( 'Tengo $ manzanas manzanas' ); trace ( 'Tengo $ { manzanas + plátanos } fruta.' );
La salida será:
Tengo 4 manzanas.Tengo 7 frutas.
Java
Al carecer de verdaderas cadenas interpoladas, Java utiliza funciones auxiliares como solución.
En las versiones 5 de Java y superiores, el método estático String.format
se puede utilizar para la interpolación:
int manzanas = 4 ; int bananas = 3 ; Sistema . fuera . println ( String . format ( "Tengo% s manzanas y% s plátanos" , manzanas , plátanos )); Sistema . fuera . println ( String . format ( "Tengo% s fruta" , manzanas + plátanos ));
En la versión 1.1 de Java y superior, la MessageFormat
clase puede formatear conjuntos de objetos mediante marcadores de posición:
Objeto [] testArgs = { Long . valueOf ( 3 ), "MiDisco" };MessageFormat form = new MessageFormat ( "El disco \" {1} \ "contiene {0} archivo (s)." );Sistema . fuera . println ( formulario . formato ( testArgs ));
JavaScript
JavaScript , a partir del estándar ECMAScript 2015 (ES6), admite la interpolación de cadenas mediante comillas invertidas ``
. Esta característica se llama literales de plantilla . [7] Aquí hay un ejemplo:
var manzanas = 4 ; var bananas = 3 ; consola . log ( `Tengo $ { manzanas } apples` ); consola . log ( `Tengo $ { manzanas + plátanos } fruta` );
La salida será:
Tengo 4 manzanasTengo 7 frutas
Julia
manzanas = 4 bananas = 3 print ( "Tengo $ manzanas manzanas y $ bananas bananas, haciendo $ ( manzanas + bananas ) piezas de fruta en total." )
La salida será:
Tengo 4 manzanas y 3 plátanos, haciendo 7 piezas de fruta en total.
Kotlin
val calidad = "superhéroe" val manzanas = 4 val plátanos = 3 val oración = "Un desarrollador es una $ calidad . Tengo $ { manzanas + plátanos } fruta" println ( oración )
La salida será:
Un desarrollador es un superhéroe. Tengo 7 frutas
Nemerle
def manzanas = 4 ; def bananas = 3 ; Consola . WriteLine ( $ "Tengo $ manzanas manzanas." ); Consola . WriteLine ( $ "Tengo $ (manzanas + plátanos) fruta." );
También admite funciones de formato avanzadas, como:
def fruit = [ "manzana" , "plátano" ]; Consola . WriteLine ( $ < #Tengo .. $ (fruta; "\ n"; f => f + "s") #>);
La salida será:
manzanasplátanos
Shell de próxima generación
Sin ${expr}
embargo, la sintaxis recomendada $var
también es compatible:
calidad = "superhéroe" manzanas = 4 plátanos = 3 oración = "Un desarrollador es una $ calidad . Tengo $ { manzanas + plátanos } fruta"
echo ( oración )
La salida será:
Un desarrollador es un superhéroe. Tengo 7 frutas
Nim
Nim proporciona interpolación de cadenas a través del módulo strutils. Los literales de cadena formateados inspirados en Python F-string se proporcionan a través del módulo strformat, la macro strformat verifica que la cadena de formato esté bien formada y bien escrita, y luego se expanden al código fuente de Nim en tiempo de compilación.
import strutils , strformat var manzanas = 4 var bananas = 3 echo "Tengo $ 1 manzanas" . formato ( manzanas ) echo fmt "Tengo {manzanas} manzanas" echo fmt "Tengo {manzanas + plátanos} frutas"# Multilínea eco FMT " '' Yo tengo { manzanas } manzanas" ''# Depurar el formato echo fmt "Tengo {manzanas =} manzanas"# Caracteres openChar y closeChar personalizados echo fmt ( "Tengo (manzanas) {manzanas}" , '(' , ')' )# Barra invertida dentro de la cadena con formato literal echo fmt " " " {" yep \ nope "} " " "
La salida será:
Tengo 4 manzanasTengo 4 manzanasTengo 7 frutastengo4 manzanasTengo manzanas = 4 manzanasTengo 4 {manzanas}síaire libre
Parasail
const Manzanas : = 4 const Plátanos : = 3 Println ( "Tengo manzanas` (Manzanas). \ n " ) Println ( " Tengo fruta `(Manzanas + Plátanos). \ n" )
La salida será:
Tengo 4 manzanas.Tengo 7 frutas.
Perl
my $ manzanas = 4 ; my $ bananas = 3 ; print "Tengo $ manzanas manzanas. \ n" ; print "Tengo @ {[$ manzanas + $ bananas]} fruta. \ n" ; # Utiliza la interpolación de matriz de Perl (@).
La salida será:
Tengo 4 manzanas.Tengo 7 frutas.
PHP
php $ manzanas = 5 ; $ plátanos = 3 ; echo "Hay $ manzanas manzanas y $ plátanos plátanos". ; echo " \ n " ; echo "Tengo $ { manzanas } manzanas y $ { plátanos } plátanos". ;
La salida será:
Hay 5 manzanas y 3 plátanos.Tengo 5 manzanas y 3 plátanos.
Pitón
# en todas las versiones manzanas = 4 bananas = 3 print ( "Tengo % d manzanas y % d bananas" % ( manzanas , bananas )) # ya no se recomienda imprimir ( "Tengo % (manzanas) d manzanas y % (bananas) d bananas " % locals ()) # ya no se recomienda # con Python 2.6+ print ( " Tengo {0} manzanas y {1} bananas " . formato ( manzanas , bananas )) print ( " Tengo {a} manzanas y {b} plátanos " . formato ( b = plátanos , a = manzanas )) # con Python 2.7+ print ( " Tengo {} manzanas y {} plátanos " . formato ( manzanas , plátanos )) # o con Python 3.6+ print ( f "Tengo { manzanas } manzanas y { plátanos } plátanos" )
La salida será:
Tengo 4 manzanas y 3 bananas
Cristal de rubí
manzanas = 4 pone "Tengo # { manzanas } manzanas" # o pone "Tengo% s manzanas" % manzanas # o pone "Tengo% {a} manzanas" % { a : manzanas }
La salida será:
Tengo 4 manzanas
Oxido
Al carecer de verdaderas cadenas interpoladas, Rust proporciona una solución a través del módulo std :: fmt , que se conecta a través de varias macros, como format! , escribe! ¡e imprímalo! . Estas macros se convierten en código fuente de Rust en tiempo de compilación, por lo que cada argumento interactúa con un formateador . El formateador admite parámetros posicionales , parámetros con nombre , tipos de argumentos y la definición de varios rasgos de formato .
let ( manzanas , plátanos ) = ( 4 , 3 ); println! ( "Hay {} manzanas y {} plátanos." , Manzanas , plátanos );
La salida será:
Hay 4 manzanas y 3 plátanos.
Scala
Scala 2.10+ ha implementado los siguientes interpoladores de cadenas: s, f y raw. También es posible escribir personalizados o anular los estándar.
El interpolador f es una macro de compilación que reescribe una cadena de formato con expresiones incrustadas como una invocación de String.format. Verifica que la cadena de formato esté bien formada y bien escrita.
Los interpoladores estándar
La interpolación de cadenas de Scala 2.10 + permite incrustar referencias de variables directamente en literales de cadenas procesadas. Aquí hay un ejemplo:
val manzanas = 4 val bananas = 3 // antes de Scala 2.10 printf ( "Tengo% d manzanas \ n" , manzanas ) println ( "Tengo% d manzanas" en formato manzanas ) // Scala 2.10+ println ( s "Tengo $ manzanas manzanas " ) println ( s" Tengo $ { manzanas + plátanos } frutas " ) println ( f" Tengo $ manzanas % d manzanas " )
La salida será:
Tengo 4 manzanas
Sciter (tiscript)
En Sciter, cualquier función cuyo nombre comience por $ se considera una función de interpolación, por lo que la interpolación es personalizable y sensible al contexto:
var manzanas = 4 var bananas = 3 var domElement = ...;domElement . $ contenido ( < p > Yo tengo { manzanas } manzanas < / p>); domElement . $ append ( < p > Yo tengo { manzanas + plátanos } frutas < / p>);
Dónde
domElement. $ content ( Tengo {manzanas} manzanas
);
se compila a esto:
domElement . html = " Tengo"
+ manzanas . toHtmlString () + "manzanas " ;
Snobol
manzanas = 4 ; bananas = 3 Salida = "Tengo" manzanas "manzanas". Salida = "Tengo" ( manzanas + plátanos ) "fruta".
La salida será:
Tengo 4 manzanas.Tengo 7 frutas.
Rápido
En Swift , se puede crear un nuevo valor de cadena a partir de una combinación de constantes, variables, literales y expresiones al incluir sus valores dentro de una cadena literal. Cada elemento insertado en el literal de cadena está envuelto en un par de paréntesis, precedido por una barra invertida.
let manzanas = 4 print ( "Tengo \ (manzanas) manzanas" )
La salida será:
Tengo 4 manzanas
Tcl
El lenguaje de comandos de herramientas siempre ha admitido la interpolación de cadenas en todas las cadenas delimitadas por comillas.
establecer manzanas 4 pone "Tengo $ manzanas manzanas".
La salida será:
Tengo 4 manzanas.
Para formatear realmente, y no simplemente reemplazar, los valores, existe una función de formateo.
establecer manzanas 4 pone [ formato "Tengo% d manzanas". $ manzanas ]
Mecanografiado
A partir de la versión 1.4, TypeScript admite la interpolación de cadenas con comillas invertidas ``
. Aquí hay un ejemplo:
var manzanas : número = 4 ; consola . log ( `Tengo $ { manzanas } apples` );
La salida será:
Tengo 4 manzanas
La console.log
función se puede utilizar como printf
función. El ejemplo anterior se puede reescribir, así:
var manzanas : número = 4 ; consola . log ( "Tengo% d manzanas" , manzanas );
La salida sigue siendo la misma.
Visual Basic
A partir de Visual Basic 14, Visual Basic admite la interpolación de cadenas.
nombre = Consola "Tom" . WriteLine ( $ "Hola, {nombre}" )
imprimirá "Hola, Tom".
Ver también
- Concatenación
- Validación de entrada incorrecta
- cadena de formato printf
- Cuasi-cotización
- Literal de cadena
- Sustitución
Notas
- ^ " Aplicación de la separación estricta del modelo-vista en motores de plantilla ", T. Parr (2004), Conferencia WWW2004.
- ^ http://perlmeme.org/howtos/using_perl/interpolation.html
- ^ "sistema de plantilla más pequeño / algoritmos más sencillos" , un tutorial en línea para sistemas de plantilla de marcador de posición.
- ^ 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 Archivado el 19 de octubre de 2012 en la Wayback Machine.
- ^ https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/#string-interpolation
- ^ "Haxe - Manual - Interpolación de cadenas" . Haxe: el kit de herramientas multiplataforma . Consultado el 12 de septiembre de 2017 .
- ^ https://developer.mozilla.org/docs/Web/JavaScript/Reference/Template_literals
- ^ https://docs.python.org/3/whatsnew/3.0.html
- ^ https://www.python.org/dev/peps/pep-0498/