Dize enterpolasyonu - String interpolation
Olarak bilgisayar programlama , dizge interpolasyon (veya değişken enterpolasyon , değişken ikame veya değişken genişleme ) bir değerlendirme işlemidir değişmez dize , bir ya da daha fazlasını ihtiva eden tutucuları yer tutucular bunların karşılık gelen değerler ile ikame edildiği bir sonuç elde edilmiştir. Bu, basit bir şablon işleme biçimidir veya resmi terimlerle, bir tür yarı alıntı (veya mantık ikamesi yorumlaması) biçimidir . Dize enterpolasyonu , dize birleştirme ile karşılaştırıldığında daha kolay ve daha sezgisel dize biçimlendirme ve içerik belirtimi sağlar .
Dize enterpolasyonu , Apache Groovy , Julia , Kotlin , Perl , PHP , Python , Ruby , Scala , Swift , Tcl ve çoğu Unix kabuğu gibi verilerin dize temsillerini yoğun olarak kullanan birçok programlama dilinde yaygındır . Genellikle iki gerçek ifade modu sunulur: biri enterpolasyon etkinken, diğeri olmadan ( ham dize olarak adlandırılır ). Yer tutucular genellikle çıplak veya adlandırılmış bir sigil (tipik olarak veya ) ile temsil edilir , ör. veya . Dizenin genişletilmesi genellikle çalışma zamanında gerçekleşir .
$
%
$placeholder
%123
Varyasyonlar
Bazı diller dize enterpolasyonu sunmaz, bunun yerine bir parametrenin printf biçimi dize olduğu ve diğer(ler)in her bir yer tutucu için değerleri sağladığı standart bir işlev sunar.
Ruby , #
enterpolasyon için sembolü kullanır ve yalnızca değişkenleri değil, herhangi bir ifadeyi enterpolasyona izin verir. Diğer diller, özel bir biçimlendirme işleviyle daha gelişmiş enterpolasyonu destekleyebilir, örneğin printf
, burada ilk argüman, format , kalan argümanların değiştirildiği kalıbı belirtir.
algoritmalar
Değişken enterpolasyon için iki ana tip genişletme değişkeni algoritması vardır :
- Yer tutucuları değiştirin ve genişletin : bul-değiştir işlemleriyle orijinalinden yeni bir dize oluşturma. Değişken referansını (yer tutucu) bulun, onu değişken değeriyle değiştirin. Bu algoritma önbellek stratejisi sunmaz.
- Bölme ve birleştirme dizesi : dizeyi bir diziye bölme ve onu karşılık gelen değerler dizisiyle birleştirme; daha sonra öğeleri birleştirme ile birleştirin. Bölünmüş dize yeniden kullanılmak üzere önbelleğe alınabilir.
Güvenlik sorunları
Dize birleştirme gibi, dize enterpolasyonu güvenlik sorunlarına yol açabilir. Kullanıcı giriş verileri uygun olmayan bir şekilde kaçar veya filtrelenirse, sistem SQL yerleştirme , komut dosyası yerleştirme , XML Dış Varlık Enjeksiyon (XXE) ve siteler arası komut dosyası çalıştırma (XSS) saldırılarına maruz kalır .
Bir SQL enjeksiyon örneği:
query = "SELECT x, y, z FROM Table WHERE id='$id'
"
Eğer $id
ile değiştirilir " "';
, bu sorgu yürütülürken Tablo tüm verileri silecek.
DELETE FROM Table; SELECT * FROM Table WHERE id='
Örnekler
Aşağıdaki Perl kodu PHP'de aynı şekilde çalışır :
$name = "Alice";
print "${name} said Hello World to the crowd of people.";
çıktıyı üretir: Alice said Hello World to the crowd of people.
ABAP
DATA(apples) = 4.
WRITE |I have { apples } apples|.
Çıktı olacaktır:
I have 4 apples
bash
apples=4
echo "I have $apples apples"
# or
echo "I have ${apples} apples"
Çıktı olacaktır:
I have 4 apples
yuh
apples = 4
print("I have $(apples) apples")
# or
print("I have {0} apples" % apples)
Çıktı olacaktır:
I have 4 apples
C#
var apples = 4;
var bananas = 3;
Console.WriteLine($"I have {apples} apples");
Console.WriteLine($"I have {apples + bananas} fruits");
Çıktı olacaktır:
I have 4 apples
I have 7 fruits
ColdFusion İşaretleme Dili
ColdFusion İşaretleme Dili (CFML) komut dosyası sözdizimi:
apples = 4;
writeOutput("I have #apples# apples");
Etiket sözdizimi:
<cfset apples = 4>
<cfoutput>I have #apples# apples</cfoutput>
Çıktı olacaktır:
I have 4 apples
Kahve Komut Dosyası
apples = 4
console.log "I have #{apples} apples"
Çıktı olacaktır:
I have 4 apples
Dart oyunu
int apples = 4, bananas = 3;
print('I have $apples apples.');
print('I have ${apples+bananas} fruit.');
Çıktı olacaktır:
I have 4 apples.
I have 7 fruit.
Gitmek
lang := "Golang"
apples := 3
fmt.Printf("I am a %s developer.\n", lang)
fmt.Printf("I have %d apples.\n", apples)
Çıktı olacaktır:
I am a Golang developer.
I have 3 apples.
harika
Harika olarak, enterpolasyonlu dizeler GStrings olarak bilinir:
def quality = "superhero"
final age = 52
def sentence = "A developer is a $quality, if he is ${age <= 42 ? "young" : "seasoned"}"
println sentence
Çıktı olacaktır:
A developer is a superhero if he is seasoned
Haxe
var apples = 4;
var bananas = 3;
trace('I have $apples apples.');
trace('I have ${apples+bananas} fruit.');
Çıktı olacaktır:
I have 4 apples.
I have 7 fruit.
Java
Gerçek enterpolasyonlu dizelerden yoksun olan Java, geçici bir çözüm olarak yardımcı işlevleri kullanır.
Java sürüm 5 ve üzeri sürümlerde, String.format
enterpolasyon için statik yöntem kullanılabilir:
int apples = 4;
int bananas = 3;
System.out.println(String.format("I have %s apples and %s bananas", apples, bananas));
System.out.println(String.format("I have %s fruit", apples + bananas));
Java sürüm 1.1 ve üzeri sürümlerde MessageFormat
sınıf, yer tutucuları kullanarak nesne kümelerini biçimlendirebilir:
Object[] testArgs = {Long.valueOf(3), "MyDisk"};
MessageFormat form = new MessageFormat(
"The disk \"{1}\" contains {0} file(s).");
System.out.println(form.format(testArgs));
JavaScript
JavaScript , ECMAScript 2015 (ES6) standardı itibariyle, backticks kullanarak dize enterpolasyonunu destekler ``
. Bu özelliğe şablon değişmezleri denir . İşte bir örnek:
const apples = 4;
const bananas = 3;
console.log(`I have ${apples} apples`);
console.log(`I have ${apples + bananas} fruit`);
Çıktı olacaktır:
I have 4 apples
I have 7 fruit
Şablon değişmezleri, çok satırlı dizeler için de kullanılabilir:
console.log(`This is the first line of text.
This is the second line of text.`);
Çıktı olacaktır:
This is the first line of text.
This is the second line of text.
Julia
apples = 4
bananas = 3
print("I have $apples apples and $bananas bananas, making $(apples + bananas) pieces of fruit in total.")
Çıktı olacaktır:
I have 4 apples and 3 bananas, making 7 pieces of fruit in total.
Kotlin
val quality = "superhero"
val apples = 4
val bananas = 3
val sentence = "A developer is a $quality. I have ${apples + bananas} fruit"
println(sentence)
Çıktı olacaktır:
A developer is a superhero. I have 7 fruit
Nemerle
def apples = 4;
def bananas = 3;
Console.WriteLine($"I have $apples apples.");
Console.WriteLine($"I have $(apples + bananas) fruit.");
Ayrıca aşağıdakiler gibi gelişmiş biçimlendirme özelliklerini de destekler:
def fruit = ["apple", "banana"];
Console.WriteLine($<#I have ..$(fruit; "\n"; f => f + "s")#>);
Çıktı olacaktır:
apples
bananas
Yeni Nesil Kabuk
Önerilen sözdizimi ${expr}
olsa $var
da desteklenmektedir:
quality = "superhero"
apples = 4
bananas = 3
sentence = "A developer is a $quality. I have ${apples + bananas} fruit"
echo(sentence)
Çıktı olacaktır:
A developer is a superhero. I have 7 fruit
Nim
Nim, strutils modülü aracılığıyla dizi enterpolasyonu sağlar. Python F-string'den ilham alan biçimlendirilmiş dizgi değişmezleri, strformat modülü aracılığıyla sağlanır, strformat makrosu, biçim dizgisinin iyi biçimlendirilmiş ve iyi yazılmış olduğunu doğrular ve ardından derleme zamanında Nim kaynak koduna genişletilir.
import strutils, strformat
var apples = 4
var bananas = 3
echo "I have $1 apples".format(apples)
echo fmt"I have {apples} apples"
echo fmt"I have {apples + bananas} fruits"
# Multi-line
echo fmt"""
I have
{apples} apples"""
# Debug the formatting
echo fmt"I have {apples=} apples"
# Custom openChar and closeChar characters
echo fmt("I have (apples) {apples}", '(', ')')
# Backslash inside the formatted string literal
echo fmt"""{ "yep\nope" }"""
Çıktı olacaktır:
I have 4 apples
I have 4 apples
I have 7 fruits
I have
4 apples
I have apples=4 apples
I have 4 {apples}
yep
ope
Nix
let numberOfApples = "4";
in "I have ${numberOfApples} apples"
Çıktı olacaktır:
I have 4 apples
ParaSail
const Apples := 4
const Bananas := 3
Println ("I have `(Apples) apples.\n")
Println ("I have `(Apples+Bananas) fruit.\n")
Çıktı olacaktır:
I have 4 apples.
I have 7 fruit.
Perl
my $apples = 4;
my $bananas = 3;
print "I have $apples apples.\n";
print "I have @{[$apples+$bananas]} fruit.\n"; # Uses the Perl array (@) interpolation.
Çıktı olacaktır:
I have 4 apples.
I have 7 fruit.
PHP
<?php
$apples = 5;
$bananas = 3;
echo "There are $apples apples and $bananas bananas.";
echo "\n";
echo "I have {$apples} apples and {$bananas} bananas.";
Çıktı olacaktır:
There are 5 apples and 3 bananas.
I have 5 apples and 3 bananas.
piton
# in all versions
apples = 4
bananas = 3
print("I have %d apples and %d bananas" % (apples, bananas)) # no longer recommended
print("I have %(apples)d apples and %(bananas)d bananas" % locals()) # no longer recommended
# with Python 2.6+
print("I have {0} apples and {1} bananas".format(apples, bananas))
print("I have {a} apples and {b} bananas".format(b=bananas, a=apples))
# with Python 2.7+
print("I have {} apples and {} bananas".format(apples, bananas))
# or with Python 3.6+
print(f"I have {apples} apples and {bananas} bananas")
Çıktı olacaktır:
I have 4 apples and 3 bananas
yakut / kristal
apples = 4
puts "I have #{apples} apples"
# or
puts "I have %s apples" % apples
# or
puts "I have %{a} apples" % {a: apples}
Çıktı olacaktır:
I have 4 apples
Pas
Gerçek enterpolasyonlu dizelerden yoksun olan Rust, format gibi çeşitli makrolar aracılığıyla arayüzlenen std::fmt modülü aracılığıyla bir geçici çözüm sağlar ! , yaz! ve yazdırın! . Bu makrolar, derleme zamanında Rust kaynak koduna dönüştürülür, bu sayede her argüman bir biçimlendirici ile etkileşime girer . Biçimlendirici konumsal parametreleri , adlandırılmış parametreleri , bağımsız değişken türlerini ve çeşitli biçimlendirme özelliklerini tanımlamayı destekler .
let (apples, bananas) = (4, 3);
println!("There are {} apples and {} bananas.", apples, bananas);
Çıktı olacaktır:
There are 4 apples and 3 bananas.
Skala
Scala 2.10+ şu dize enterpolatörlerini uygulamıştır: s, f ve raw. Özel olanları yazmak veya standart olanları geçersiz kılmak da mümkündür.
f enterpolatörü, String.format çağrısı olarak gömülü ifadelerle bir format dizesini yeniden yazan bir derleyici makrodur. Biçim dizesinin iyi biçimli ve iyi yazılmış olduğunu doğrular.
Standart enterpolatörler
Scala 2.10+'ın dize enterpolasyonu, değişken referanslarını doğrudan işlenmiş dize değişmezlerine gömmeye izin verir. İşte bir örnek:
val apples = 4
val bananas = 3
//before Scala 2.10
printf("I have %d apples\n", apples)
println("I have %d apples" format apples)
//Scala 2.10+
println(s"I have $apples apples")
println(s"I have ${apples + bananas} fruits")
println(f"I have $apples%d apples")
Çıktı olacaktır:
I have 4 apples
Sciter (tiscript)
Sciter'da adı $ ile başlayan herhangi bir işlev enterpolasyon işlevi olarak kabul edilir ve bu nedenle enterpolasyon özelleştirilebilir ve bağlama duyarlıdır:
var apples = 4
var bananas = 3
var domElement = ...;
domElement.$content(<p>I have {apples} apples</p>);
domElement.$append(<p>I have {apples + bananas} fruits</p>);
Neresi
domElement.$content(<p>I have {apples} apples</p>);
buna derlenir:
domElement.html = "<p>I have " + apples.toHtmlString() + " apples</p>";
züppe
apples = 4 ; bananas = 3
Output = "I have " apples " apples."
Output = "I have " (apples + bananas) " fruit."
Çıktı olacaktır:
I have 4 apples.
I have 7 fruit.
Süratli
In Swift , yeni dize değeri bir dize içindeki değerlerini dahil ederek sabitler, değişkenler, değişmezleri ve ifadelerin karışımından oluşturulabilir. Dize değişmezine eklenen her öğe, önüne ters eğik çizgi eklenmiş bir çift parantez içine alınır.
let apples = 4
print("I have \(apples) apples")
Çıktı olacaktır:
I have 4 apples
Tcl
Araç Komut Dili, tüm tırnakla ayrılmış dizelerde dize enterpolasyonunu her zaman desteklemiştir.
set apples 4
puts "I have $apples apples."
Çıktı olacaktır:
I have 4 apples.
Değerleri gerçekten biçimlendirmek ve basitçe değiştirmek için değil, bir biçimlendirme işlevi vardır.
set apples 4
puts [format "I have %d apples." $apples]
TypeScript
1.4 sürümünden itibaren TypeScript , backticks kullanarak dize enterpolasyonunu destekler ``
. İşte bir örnek:
var apples: number = 4;
console.log(`I have ${apples} apples`);
Çıktı olacaktır:
I have 4 apples
console.log
Fonksiyon olarak kullanılabilir printf
fonksiyonu. Yukarıdaki örnek şu şekilde yeniden yazılabilir:
var apples: number = 4;
console.log("I have %d apples", apples);
Çıktı aynı kalır.
Visual Basic
Visual Basic 14'ten itibaren, Visual Basic'te Dize İnterpolasyonu desteklenmektedir.
name = "Tom"
Console.WriteLine($"Hello, {name}")
"Merhaba, Tom" yazacaktır.