nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Učionica
  • Saveti
  • Zanimljivosti
  • Kontakt

Šablonske niske u programskim jezicima

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark

Uvod

U programskom jeziku JavaScript, šablonske niske (eng. - template literals), predstavljaju elegantan način da se vrednosti promenljivih i izraza, direktno uvrste u niske (pre nego što niska bude prosleđena na dalju obradu) - bez potrebe za upotrebom funkcija ili operatora za konkatenaciju.

U drugim programskim jezicima, naziv 'šablonske niske' - ne koristi se zvanično, ali, principi i tehnike svakako postoje, pa ćemo u nastavku napraviti detaljan osvrt na implementaciju koncepta šablonskih niski, ne samo u JavaScript-u, već i u PHP-u, Python-u i C#-u.

Iako su šablonske niske glavna tema članka (kojoj ćemo posvetiti najviše pažnje), iskoristićemo priliku da se na samom početku detaljno upoznamo i sa osnovnim načinima za spajanje niski, preko funkcija i operatora konkatenacije (čime članak praktično postaje svojevrstan praktikum za spajanje niski u širem kontekstu).

Konkatenacija - osnovni metod spajanja

Osvrnimo se (za početak), na princip spajanja niski u programskim jezicima sa precizno definisanim tipovima podataka, u kojima je (preko operatora za spajanje niski), moguće spajati niske - ali, nije moguće spajati kombinovane podatke.

Za primer možemo uzeti sledeći C++ kod:

		
string s1 = "Dobar";
string s2 = " dan!"
string s3 = s1 + s2;
		
	
Slika 1. - Primer C++ naredbi za spajanje dve niske i ispis rezultata.

Ako bismo kod smestili u funkciju main i pokrenuli program, sadržaj niske s3, bio bi: Dobar dan!

Ukoliko je potrebno spojiti nisku sa vrednošću brojčane promenljive:

		
int a    = 10;
string s = "duzina: ";
		
	
Slika 2. - Promenljive u C++-u koje treba spojiti u jednu nisku.

.... brojčani podatak se prvo mora pretvoriti u nisku, preko odgovarajuće funkcije:

		
// Zarad korišćenja funkcije to_string,
// mora se koristiti pretprocesorska direktiva:
// #include <string>

string s3 = s + std::to_string(a);
		
	
Slika 3. - Spajanje niske i brojčane promenljive u C++-u (preko pomoćne funkcije).

Skriptni jezici (za razliku od jezika sa strogom tipizacijom), pružaju .... 'privid slobode' * (kada je u pitanju spajanje niski i celobrojnih promenljivih), a budući da primere iz skriptnih jezika lako možete isprobavati uporedo sa čitanjem članka, usmerićemo se na spajanje niski unutar standardnih naredbi za ispis.

Principi za spajanje niski sa vrednostima brojčanih promenljivih, isti su i u slučaju da koristimo naredbe dodele.

* Pri spajanju niski i brojeva u skriptnim jezicima, najčešće o tipovima podataka ne moramo voditi računa samostalno, pa deluje da smo 'rasterećeni', međutim ....

U iole kritičnim situacijama - moraćemo da 'priskačemo' i ručno podešavamo parametre ispisa (videćemo primere u nastavku), a takav pristup sasvim podseća na jezike sa striktnom tipizacijom podataka (gde se o tipovima podataka mora voditi računa uvek).

U većini skriptnih jezika, kada se funkciji za ispis preda (samo) jedan argument, odnosno promenljiva bilo kog tipa (makar kada su u pitanju prosti tipovi i niske), tip podatka će biti prepoznat automatski i vrednost će biti uredno ispisana.

Primera radi, ako pozovemo naredbu console.log u JavaScript-u ....

		
let a = 124;
console.log(a);
		
	
Slika 4. - Instrukcije za ispis vrednosti promenljive u JS-u.

.... ili funkciju print u Python-u ....

		
a = 124
print(a)
		
	
Slika 5. - Instrukcije za ispis vrednosti promenljive u Python-u.

.... brojčani argument 124 će automatski biti pretvoren u nisku i dobićemo ispis "124".

Međutim, ako pokušamo da dodamo string konstantu kojom se promenljiva imenuje u ispisu, tako da ispis bude "a = 124" ....

		
let a = 124
console.log("a = " + a);
		
	
Slika 6. - Instrukcije za kombinovani ispis u JS-u.

.... JavaScript će i ovoga puta uredno ispisati vrednost (deluje da JS "prepoznaje šta pokušavamo", ali zapravo samo sve argumente automatski pretvara u niske) ....

		
a = 124
		
	
Slika 7. - Rezultat izvršavanja koda sa prethodne slike.

.... ali će zato Python ....

		
a = 124
print("a = " + a)
		
	
Slika 8. - Instrukcije za kombinovani ispis u Python-u.

.... prijaviti grešku:

		
Traceback (most recent call last):
  File "ispis.py", line 5, in <module>
    print("a = " + a)
TypeError: must be str, not int
		
	
Slika 9. - Rezultat izvršavanja koda sa slike 5. je - greška.

Ništa strašno, ali za razliku od JavaScript-a, funkcije i operatori za ispis niski u programskim jezicima (tipično) postupaju onako kako smo videli na primeru Python-a: u kombinovanom ispisu u kome se pozivaju brojčane promenljive, moraju se koristiti funkcije za eksplicitno pretvaranje brojčanih vrednosti u niske. *

Osvrnimo se ukratko na razloge .....

* Možemo (naravno) koristiti šablonske niske, ali - upoznavanje sa šablonskim niskama tek predstoji i takođe, vidimo da smo vrlo brzo došli do situacija u kojima parametre ispisa moramo podešavati ručno.

Razlike između formata zapisa brojčanih vrednosti i niski

Da bismo najlakše prikazali razlike između formata koji se koristi za zapis brojčanih vrednosti, i formata koji se koristi za zapis niski, uzećemo za primer celobrojnu (int) promenljivu i nisku - koje naizgled predstavljaju isti podatak.

Celobrojne vrednosti se na računarima (tipično) zapisuju preko 4 bajta (32 bita), što omogućava predstavljanje vrednosti između -2147483648 i 2147483647.

Recimo, ako se broj 143 zapiše kao celobrojna promenljiva, zapis ima sledeći oblik:

zapis brojeva
Slika 10. - Struktura broja 143, koji je zapisan kao celobrojna promenljiva.

Niska "143" (naizgled sličan podatak), predstavlja se na primetno drugačiji način, kao niz znakova "1", "4" i "3", koji su kodirani preko odgovarajućih ASCII vrednosti:

  • '1' - 49
  • '4' - 52
  • '3' - 51
zapis niski
Slika 11. - Struktura niske "143", koja je zapisana preko ASCII vrednosti znakova '1', '4' i '3'.

Vidimo dakle da se, pri ispisu, celobrojna vrednost 143 mora pretvoriti u nisku "143" i samo je pitanje da li će program to uraditi bez intervencije korisnika (kao što to radi JavaScript), ili neće (kao što je slučaj sa većinom ostalih programskih jezika).

Konkatenacija preko funkcija

Pre nego što se posvetimo operatorima konkatenacije, pomenućemo (informativno), da u programskim jezicima postoje i funkcije za spajanje niski.

Primera radi, pokretanjem sledećeg JS koda ....

		
let s1 = "Dobar ";
let s2 = "dan!";
console.log(s1.concat(s2));
		
	
Slika 12. - Konkatenacija niski u JS, preko funkcije concat.

.... u konzoli browser-a biće ispisano "Dobar dan!".

Međutim, na ovakav pristup se nećemo osvrtati previše, jer ćemo za spajanje niski uglavnom koristi operatore za spajanje i šablonske niske.

Upotrebu operatora i obrazaca za formatiranje teksta proučavaćemo na primeru sledećih jezika:

  • JavaScript - opšteprisutni jezik za skriptovanje web stranica
  • C# - predstavnik C-olikih jezika
  • Python - predstavnik skriptnih jezika
  • PHP - predstavnik serverskih jezika

Sam termin 'šablonske niske', koji se koristi u domaćoj literaturi, prevod je engleskog termina 'template strings' koji je u jeziku JavaScript-u označavao koncept o kome govorimo, sve do verzije jezika ES6 koja se pojavila 2015, kada je uvedeno nešto zvaničnije ime - 'template literals'.

Pri upotrebi operatora za spajanje niski, podrazumeva se da su operandi niske, to jest, da ukoliko određeni operand nije niska - takav operand mora prethodno biti pretvoren u nisku na propisan način (najčešće preko ugrađene funkcije za pretvaranje brojčanih vrednosti u niske).

.... osim u slučaju JS-a koji sve radi automatski (kao što smo već videli).

Konkatenacija preko operatora u JavaScript-u

Spajanje niski u JavaScript-u obavlja se preko operatora + (bez potrebe za eksplicitnim konvertovanjem podataka):

		
let s1 = "Vrednost ";
let s2 = "promenljive a je: ";
let a  = 12;

let s = s1 + s2 + a;
		
	
Slika 13. - Konkatenacija niski preko operatora + u JavaScript-u.

Međutim, "liberalan" pristup u spajanju niski u JavaScript-u podrazumeva da se na određene pojave mora obratiti pažnja.

Na internetu se može pronaći mnogo pošalica na račun navedene situacije ("JavaScript je jedini jezik u kome je 2 + 2 = 22" i slično), ali, to je samo "druga strane medalje" u situaciji u kojoj JS sam pretvara vrednosti promenljivih u niske (onda kada nije krajnje nedvosmisleno da u sabiranju učestvuju dve brojčane vrednosti).

U JavaScript-u 2 + 2 je (ipak) 4, ali zato naredba "2" + "2" kao rezultat daje "22".

U praktičnom smislu, slobodniji pristup pri spajanju niski i vrednosti promenljivih, uglavnom (samo) doprinosi lakšem i bržem kreiranju skripti i najčešće nema zbrke (pogotovo ako se ispis obavlja neposredno posle naredbe dodele i sl), ali .... recimo da je najbolje da u kritičnim situacijama, budemo oprezni.

Ako je potrebno da se pobrinemo da "2 + 2 bude 4" - potrebno je koristiti funkciju parseInt (ili parseFloat, za decimalne vrednosti), pre nego što pozovemo operator +, čime JS interpretatoru nedvosmisleno stavljamo do znanja da su u pitanju brojevi (a ne niske), to jest - čime JS interpretatoru stavljamo do znanja da pozivamo operaciju sabiranja brojeva, a ne operaciju spajanja niski.

Formatiranje decimalnih vrednosti u JavaScript-u

Ukoliko je u ispisu potrebno formatirati decimalne vrednosti na određen način (zadati određen broja decimala), može se koristiti funkcija toFixed(n) (gde argument n predstavlja broj decimala):

		
let a = 12.3456;
console.log("a = " + parseFloat(a).toFixed(2));
		
	
Slika 14. - Formatiranje decimalnih brojeva u JS-u, preko funkcije toFixed.

Konkatenacija u Python-u

U python-u, spajanje niski sa vrednostima promenljivih metodom konkatenacije, podrazumeva upotrebu funkcije str, koja za predatu brojčanu vrednost vraća odgovarajuću nisku (dok je sam operator spajanja i u slučaju Python-a +):

		
s1 = "Vrednost "
s2 = "promenljive a je: "
a = 12

s = s1 + s2 + str(a);
		
	
Slika 15. - Konkatenacija niski preko operatora u Python-u.

Formatiranje decimalnih vrednosti u Python-u

Za formatiranje ispisa decimalnih brojeva, Python koristi C-ovski pristup, koji podrazumeva upotrebu specifikatora konverzije ....

		
a = 12.3456
print("a = %.2f" %a)
		
	
Slika 16. - Formatiranje decimalnih brojeva u Python-u.

.... ali, u Python-u nema zareza između komandnog stringa i realnih argumenata.

Konkatenacija u C#-u

U programskom jeziku C#, u kome su brojčani podaci tipa Int32 i Float/Double zapravo objekti klasa, za spajanje vrednosti promenljivih sa niskama se koristi ugrađena metoda ToString:

		
String s1 = "Vrednost ";
String s2 = "promenljive a je: ";
Int32  a  = 12;

String s = s1 + s2 + a.ToString();
		
	
Slika 17. - Konkatenacija niski preko operatora u C#-u.

Formatiranje decimalnih vrednosti u C#-u

Zadavanje formata decimalnih brojeva (u okviru ugrađene metode ToString), u C#-u je izvedeno na posebno elegantan način:

		
String s = "PI = " + Math.PI.ToString("0.0000");
		
	
Slika 18. - Formatiranje decimalnih brojeva u C#-u.

U gornjem primeru, odredili smo četiri decimale za ispis, a ako želimo vodeće nule u ispisu, možemo predati nisku "00.0000" kao argument pri pozivu metode ToString.

Konkatenacija u PHP - u

Spajanje niski u PHP-u (kako je to bio slučaj i sa drugim web jezikom, JavaScript-om) takođe je pojednostavljeno, ali, specifičnost je operator . (tačka), umesto uobičajenog operatora +:

		
<?php
	$s1 = "Vrednost ";
	$s2 = "promenljive a je: ";
	$a  = 12;

	$s = $s1 . $s2 . $a . "</br>";
?>
		
	
Slika 19. - Konkatenacija niski preko operatora u PHP-u.

Formatiranje decimalnih vrednosti u PHP-u

Formatiranje decimalnih brojeva u PHP-u tipično se obavlja preko funkcije number_format:

		
<?php
	$PI = 3.14159265359;
	$s  = "PI = " + number_format($PI, 4);
?>
		
	
Slika 20. - Formatiranje decimalnih brojeva u PHP-u.

Prepoznavanje praktičnih nedostataka operatora konkatenacije u slučaju većih niski

Programski kodovi koje ste do sada videli u članku, sami po sebi vas verovatno ne bi mogli ("baš skroz"), ubediti da postoji išta sporno u tome da za spajanje niski (sa drugim niskama ili sa vrednostima promenljivih/izraza) - nastavimo da koristimo operatore konkatenacije, ali - to je zato što su primeri bili krajnje jednostavni.

Međutim, da bismo videli šta se dešava kada se niske "zakomplikuju", pogledaćemo primer koji prikazuje jedan od svakodnevnih poslova u PHP-u (odstupićemo za trenutak od JavaScript-a).

Jedan od glavnih zadataka serverskog jezika kao što je PHP, je formatiranje HTML sadržaja u kojima se koriste vrednosti (brojčane i tekstualne) koje su preuzete iz baza podataka (kada se HTML kod pripremi na serveru, prosleđuje se klijentu koji je zatražio navedeni kod preko HTTP protokola).

Za jednostavne kodove ....

		
<?php
	$naslov_h1 = "<h1>" . $red['naslov_h1'] . "</h1>";
?>
		
	
Slika 21. - Primer PHP koda koji prikazuje situaciju u kojoj je praktično koristiti operator za spajanje niski.

.... svakako (i dalje) možemo koristiti operator konkatenacije.

Međutim, ako se zadržimo na ideji sa prethodne slike (umetanje vrednosti promenljivih u HTML) - ali pri tom povećamo obim teksta (mada, nećemo ni u novom primeru 'preterivati', zarad preglednosti) - situacija će se promeniti.

U drugom primeru, HTML kod po sledećem obrascu ....

		
<?php
	echo "<figure>
		<img href='/slike/galerija/mona_liza.png' alt='Leonardo DaVinči - Mona Liza Đokonda'/>
		<figcaption>
			Slika 12. - Mona Liza Đokonda, čuvena slika Leonarda DaVinčija, naslikana je #### godine i nalazi se u muzeju Luvr u Parizu
		</figcaption>
	</figcaption>";
?>
		
	
Slika 22. - Obimnija niska koja predstavlja HTML tag, koji je praktičnije formatirati umetanjem vrednosti promenljivih.

.... treba formatirati preko PHP-a (sa umetanjem vrednosti koje su preuzete iz baze podataka) ....

		
<?php
	echo "<figure>
		<img href='" . $red['datoteka_naziv'] . " alt='" . $red['slika_alt'] . "'/>
		<figcaption>
			" . $red['slika_opis'] .
		"</figcaption>
	</figcaption>";
?>
		
	
Slika 23. - Primer PHP koda koji prikazuje situaciju u kojoj korišćenje operatora za spajanje niski - nije praktično.

.... i sada već vidimo da konkatenacija nije ni iz daleka najelegantniji način.

Rešenje je (pogađate) - upotreba šablonskih niski.

Definicija pojma šablonskih niski u programskim jezicima

Šablonske niske su tekstualni obrasci koji su zapisani na poseban način (vrlo slično običnim niskama, ali - uz određene izmene i dodatke), tako da pojava identifikatora promenljivih, ili izraza, sugeriše interpretatorima/prevodiocima da navedene delove u ispisu ne treba prikazivati doslovno, već da identifikatore promenljivih pre ispisa treba zameniti odgovarajućim vrednostima, odnosno, da izrazi unutar šablonskih niski, treba da budu zamenjeni vrednošću izraza.

Prosto rečeno, možemo reći da je u pitanju umetanje vrednosti promenljivih u nisku (a kao što smo već naveli, mogu se umetati i vrednosti izraza, kao i sadržaj postojećih niski).

Za početak, pogledaćemo implementaciju koncepta šablonskih niski u JavaScript-u, jedinom jeziku u kome se navedeni termin (eng. template literals - šablonske niske), upotrebljava kao zvaničan naziv.

Šablonske niske u JavaScript-u

Pošto smo izneli veću količinu informacija koje su vezane za teoriju i druge metode spajanja niski, nekako je red da se što pre osvrnemo i na primer koji se odnosi na glavnu temu članka - upotrebu šablonskih niski u JavaScript-u:

		
let Pi = 3.14159265359;
let s  = `Pi = ${Pi}`;
		
	
Slika 24. - Jednostavan primer korišćenja šablonskih niski u JS-u.

Kada pokrenemo skriptu, umesto niske ${Pi}, u ispisu će se pojaviti (približna) vrednost konstante Pi.

Međutim, da bismo se za prave upoznali sa šablonskim niskama u JS-u, poslužićemo se praktičnijim primerom (koji smo već "načeli" u prethodnom odeljku).

Ponovo se bavimo slikama (ali je ovoga puta jezik JavaScript) i recimo da je preko AJAX-a (uskoro ćemo AJAX-u posvetiti zaseban članak), do JS skripte došao sledeći JSON objekat ....

		
let slika_info = {
	"datoteka_naziv" : "slike/galerija/mona_liza.png",
	"slika_alt"      : "Leonardo Da Vinči - Mona Liza Đokonda",
	"opis"     : "Mona Liza Đokonda, čuvena slika Leonarda DaVinčija, nastala u periodu između 1503. i 1506, nalazi se u muzeju Luvr u Parizu i smatra se jednim od najvažnijih umetničkih dela svih vremena"
};
		
	
Slika 25. - Primer JSON objekta koji ćemo spajati sa niskama.

.... i da je, podatke iz JSON objekta, potrebno ubaciti u HTML kod koji smo videli u prethodnom odeljku (tako da od polja iz JSON objekta budu iskorišćeni: slika i opis slike).

Najlakše ćemo problem rešiti ako implementiramo funkciju koja preko šablonske niske vraća traženi HTML kod.

		
function slikaInfoFormatiranje(slika_info){
	let sablon_slika =

`<figure>
	<img href='${slika_info['datoteka_naziv']}' alt='${slika_info['slika_alt']}'/>
	<figcaption>
		${slika_info['opis']}
	</figcaption>
</figcaption>`;

	return sablon_slika;
}
		
	
Slika 26. - Šablonska niska koja se poziva na JSON objekat sa prethodne slike.

Da pojasnimo:

  • šablonske niske u JS-u počinju i završavaju se znakom backtick ` (nije apostrof, već znak koji se na tastaturama tipično nalazi ispod tastera ESC)
  • izrazi se smeštaju unutar vitičastih zagrada kojima direktno prethodi znak $ (u gornjem primeru, koristili smo obične promenljive, a ne višečlane izraze, međutim, princip zapisa je isti)
  • šablonske niske se mogu pisati u više redova (bez dodatnog označavanja "prelazaka u novi red")
  • vrednosti na koje se pozivamo unutar šablonskih niski, moraju biti unapred definisane (deklarisane i inicijalizovane)

Poslednja stavka zaslužuje posebnu pažnju.

Iako smo naveli pravilan postupak, objasnićemo i zašto je kod napisan, tako kako je napisan.

Šablon koji navodimo (unutar niske koja je uokvirena znacima ``), nije apstraktni šablon opšteg tipa koji se definiše na određenom mestu - i može se proizvoljno pozvati pre nego što smo inicijalizovali vrednosti koje se koriste u šablonskoj niski (kao što recimo funkcije možemo zapisivati pre i posle mesta na kojima ih pozivamo) - već se (konkretan) sadržaj niske koja je definisana preko šablona, formira na licu mesta, shodno unapred definisanim vrednostima.

Ali, postoji i krajnje funkcionalno (i pri tom, sasvim elegantno) rešenje, koje smo već videli: šablonska niska može se smestiti unutar funkcije, a vrednosti koje treba "utisnuti" u šablon, predaju kao argumenti. Na kraju - funkcija vraća formiranu nisku.

U praksi, ako koristimo veći broj sličnih funkcija koje sadrže obimne tekstualne obrasce, možemo ih zarad preglednosti smestiti u posebnu .js datoteku.

Korišćenje izraza u šablonskim niskama

Osim identifikatora promenljivih, u šablonskim niskama možemo koristiti i matematičke izraze, pozive funkcija, elemente nizova i polja objekata:

		
function sabiranje(a, b) {
	return a + b;
}

let x = 9;
let y = 6
let vrednostPI = `${2 + 1}.${sabiranje(9, 5)}${x + y}9265359`;

console.log(vrednostPI);

let niz = [
	{
		ime: "Leonardo",
		prezime: "Davinči"
	},
	{
		ime: "Hijeronimus",
		prezime: "Boš"
	}
];

let ispis_1 = `Slikar 1: ${niz[0].ime niz niz[0].prezime}`;
let ispis_2 = `Slikar 2: ${niz[1].ime niz niz[1].prezime}`;

console.log(ispis_1);
console.log(ispis_2);
		
	
Slika 27. - Šablonske niske koje koriste vrednosti izraza, rezultate izvršavanja funkcija, elemente nizova i polja objekata.

Još jedan jednostavan primer koji prikazuje lepotu programskih jezika u opštem smislu.

Šabloni za kreiranje niski u PHP-u (heredoc, nowdoc)

U PHP-u, budući da je u pitanju serverski jezik čija je jedna od osnovnih uloga - dinamičko serviranje HTML-a, koncept šablonskih niski koristi se verovatno i više nego u JS-u (doduše, ne pod tim nazivom, već pod drugim nazivima).

Osim korišćenja običnih stringova i operatora konkatenacije, u PHP-u je šablone za formiranje stringova moguće definisati na dva (različita) načina, koji su poznati kao heredoc i nowdoc.

Međutim, na ovom mestu (pre nego što se osvrnemo na heredoc i nowdoc sintaksu), želimo da pokažemo da se većina zahvata pri kreiranju tekstualnih obrazaca koji koriste identifikatore promenljivih, sasvim uspešno može obaviti i preko običnih niski koje su uokvirene navodnicima (makar je tako kada su u pitanju jednostavniji obrasci koji se zapisuju u jednom redu).

Interpretacija niski koje su uokvirene navodnicima

Do sada ste se verovatno sretali sa niskama u PHP-u, u kojima se pozivaju vrednosti promenljivih i možemo (najprostije) reći da se u PHP-u podrazumeva da će niske koje su uokvirene navodnicima, biti interpretirane, tako što će identifikatori promenljivih biti zamenjeni vrednostima promenljivih.

Tipičan primer su SQL upiti kakve smo pisali do sada:

		
<?php
	$upit = "SELECT * FROM T1 WHERE email='$email'";
?>
		
	
Slika 28. - Vrednosti unutar niske koja je uokvirena navodnicima u PHP-u, biće zamenjene odgovarajućim vrednostima pre ispisa (ili dalje obrade).

Prethodno zapisani upit, pri pozivu skripte praktično postaje:

		
SELECT * FROM T1 WHERE email='maja_andric@gmail.com'
		
	
Slika 29. - Sadržaj niske sa prethodne slike posle zamene identifikatora promenljive - vrednošću promenljive.

Identifikator promenljive $email zamenjen je vrednošću promenljive.

PHP dozvoljava i zapis običnih niski u više redova, ali heredoc obrasci svakako predstavljaju elegantnije rešenje ukoliko se niska 'prostire' preko više redova (videćemo uskoro kako heredoc i nowdoc obrasci funkcionišu u praksi).

Ispis niski koje su uokvirene apostrofima

Za razliku od prethodnog zapisa (između znakova navoda), ako nisku zapišemo unutar apostrofa - vrednosti promenljivih neće biti interpretirane:

		
<?php
	echo 'Promenljive se u PHP-u definišu preko znaka "$"';
	echo ' (na primer: $a,$b, $upit, $veza).'
?>
		
	
Slika 30. - Primer niske koja je uokvirena apostrofima.

Navedeni princip zapisa prikladan je za situacije u kojima je potrebno prikazati PHP kod na web sajtovima (kod sa prethodne slike daje sledeći ispis):

		
Promenljive se u PHP-u definišu preko znaka "$" (na primer: $a,$b, $upit, $veza).
		
	
Slika 31. - Ispis koji se dobija pozivanjem koda sa prethodne slike

Heredoc

Takozvana heredoc sintaksa u PHP-u (prepoznatljiva po početnom delu niske koji je formiran po obrascu: <<<NAZIV), podrazumeva sledeće:

  • u okviru niske mogu se pojavljivati identifikatori i izrazi - koji će biti interpretirani pre ispisa (to jest, zamenjeni niskama koje odgovaraju vrednostima promenljivih ili izraza)
  • niska može zauzeti više redova.

Razmotrićemo konkretan primer (pri čemu ćemo dodati i nekoliko promenljivih, da bi programski kod mogao da proradi, ako isprobavate primere):

		
<?php
	$ime     = "Petar";
	$prezime = "Marinković";
	$email   = "peramarinkovic@gmail.com"

	$sablon = <<<SABLON
	<div class='info'>
		<div class='info_red'>
			<span>Ime:</span><span>{$ime}</span>
		</div>

		<div class='info_red'>
			<span>Prezime:</span><span>{$prezime}</span>
		</div>

		<div class='info_red'>
			<span>E-mail:</span><span>{$email}</span>
		</div>
	</div>
	SABLON;

	echo $sablon;
?>
		
	
Slika 32. - Heredoc sintaksa u PHP-u.

Ako pozovemo skriptu koju smo prethodno definisali, dobićemo sledeći ispis:

		
Ime: Petar
Prezime: Marinković
E-mail: peramarinkovic@gmail.com
		
	
Slika 33. - Ispis koji se dobija pozivanjem koda sa prethodne slike.

Baš kao i u slučaju običnih niski koje su zapisane između znakova navoda, i u gornjoj skripti će identifikatori promenljivih biti zamenjeni vrednostima promenljivih.

Takođe - baš kao i u slučaju kada smo koristili JavaScript - vrednosti promenljivih koje se koriste, moraju biti definisane unapred (pre korišćenja šablona).

Da bismo izbegli nedoumice oko toga da li identifikatori koje koristimo u obrascu, imaju veze sa promenljivama koje zapravo postoje i imaju vrednost (ili su navedeni identifikatori 'fiktivnih' promenljivih), i u PHP-u se tekstualni obrazac može smestiti unutar funkcije (koja se, za razliku od samostalnog heredoc obrasca, može pozivati bilo gde).

Ovoga puta, funkcija će kao argument primati objekte klase Osoba:

		
<?php
	function formatiranje_podataka_osoba($osoba) {

		$sablon = <<<SABLON
<div class='info'>
	<div class='info_red'>
		<span>Ime:</span><span>${$osoba->ime}</span>
	</div>

	<div class='info_red'>
		<span>Prezime:</span><span>${$osoba->prezime}</span>
	</div>

	<div class='info_red'>
		<span>E-mail:</span><span>${$osoba->email}</span>
	</div>
</div>
SABLON;

		return $sablon;
	}
?>
		
	
Slika 34. - Funkcija za formatiranje ispisa koja koristi heredoc obrazac.

Kao i do sada, možemo zaključiti da je standardna notacija niski pod navodnicima, dovoljna za sitnije zahvate, a da se heredoc format može koristiti za veće blokove sa puno promenljivih čije vrednosti treba uvrstiti u ispis, pri čemu postoji i dodatna pogodnost: unutar heredoc obrazaca, znake navoda možemo pisati neposredno (primetimo da heredoc blok nije uokviren navodnicima ili apostrofima, što (na izvestan način), sugeriše da navedeni znakovi nemaju poseban značaj u heredoc obrascu).

Vidimo da je indentacija donekle diskutabilna (indentacija = uvlačenje koda), odnosno, deluje da smo zanemarili pravila za uvlačenje koda na kojima inače insistiramo?!

Međutim, postoji razlog zašto pišemo onako kako ste videli: heredoc obrasci (vrlo) doslovno poštuju uvlačenje/"neuvlačenje", što znači da će se - ako dodamo razmake ili tabove - navedeni znakovi pojaviti i u HTML-u (ili, inače, na drugim mestima u ispisu).

Što se tiče HTML-a, dodatni whitespace znakovi neće predstavljati problem u praksi, jer browser-i pri interpretaciji HTML datoteka ionako u prikazu "sažvaću" višestruke whitespace-ove i ostave samo jedan, dok u slučaju da obrazac koristimo za formatiranje običnog teksta koji će se negde pojaviti, neće biti svejedno da li smo pisali dodatne razmake, ili nismo!

Ako ne želimo da se vrednosti promenljivih/izraza interpretiraju, već želimo da se ispišu neposredno (kao u slučaju niski koje su uokvirene apostrofima), možemo koristiti takozvani nowdoc format:

Nowdoc

Pri imenovanju nowdoc obrazaca, koriste se apostrofi ili navodnici, za uokviravanje samog naziva (u donjem primeru, naziv je 'SABLON'):

		
<?php
	$sablon = <<<'SABLON'
<div class='info'>
	<div class='info_red'>
		<span>Ime:</span><span>{$ime}</span>
	</div>

	<div class='info_red'>
		<span>Prezime:</span><span>{$prezime}</span>
	</div>

	<div class='info_red'>
		<span>E-mail:</span><span>{$email}</span>
	</div>
</div>
SABLON;

	echo $sablon;
?>
		
	
Slika 35. - Nowdoc sintaksa u PHP-u.

Ukoliko se posle niske <<<, pojavi niska koja je uokvirena apostrofima ili navodnicima, PHP interpretator neće interpretirati obrazac koji sledi, već će obrazac biti prikazan kao običan tekst.

Pokretanjem koda sa prethodne slike, dobićemo sledeći ispis:

		
Ime: {$ime}
Prezime: {$prezime}
E-mail: {$email}
		
	
Slika 36. - Ispis koji se dobija pozivanjem funkcije sa prethodne slike.

Nowdoc sintaksa se tipično koristi u okolnostima kada je potrebno (doslovno) prikazati veće blokove teksta koji sadrže PHP kod.

Implementacija obrazaca za ispis teksta u Python-u

Najveću pažnju smo posvetili web jezicima, jer se upravo u web jezicima koncept šablonskih niski primenjuje (reklo bi se da je tako), češće nego kada su u pitanju jezici preko kojih se pišu desktop programi, ali, nismo zaboravili ni Python i C#.

Koncept šabloniziranog teksta koji koristi vrednosti promenljivih/izraza, u Python-u je (kao i mnogo šta drugo), implementiran na jednostavan način, preko takozvanih "f-niski":

		
ime     = "Petar"
prezime = "Marinković"
email   = "peramarinkovic@gmail.com"

s = f"Ime: {ime}\nPrezime: {prezime}\nE-mail: {email}"
print(s)
		
	
Slika 37. - Primer upotrebe "f-niski" u Python-u.

Primećujemo escape sekvence za prelazak u novi red \n i takođe, sada već dobro poznate, vitičaste zagrade koje uokviruju identifikatore promenljivih i izraze.

Kod iz prethodnog odeljka daje sledeći ispis:

		
Ime: Petar
Prezime: Marinković
E-mail: peramarinkovic@gmail.com
		
	
Slika 38. - Ispis koji se dobija pozivanjem koda sa prethodne slike.

Kratko, jednostavno i funkcionalno, uz napomenu da su f-niske opcija novijeg datuma (koja je dostupna samo u verzijama Pythona 3.x, ali, ne i starijim verzijama).

Implementacija obrazaca za ispis teksta u C#-u

Šablonske niske u C#-u počinju znakom $, a za uokviravanje identifikatora promenljivih / izraza (čije vrednosti treba uvrstiti u nisku), i u C#-u se takođe koriste vitičaste zagrade { i }:

		
String ime = "Petar";
String prezime = "Marinković";
String email = "peramarinkovic@gmail.com";

String s = $"Ime: {ime}\nPrezime: {prezime}\nE-mail: {email}";
		
	
Slika 39. - Zapis šabloniziranog tekstualnog obrasca u C#-u.

Kao što je bio slučaj i sa prethodnim jezicima, vidimo da je i C# sintaksa za definisanje šablonskih niski, jednostavna za pisanje i razumevanje.

Zaključak

Za kraj, imamo želju da vas potaknemo da se pozabavite svojevrsnim prepoznavanjem obrazaca u razvoju informacionih tehnologija i razmišljanjem na temu: šta je prava svrha računara.

Ako se zapitamo šta je to što pokreće razvoj programa, programskih jezika i pojedinačnih tehnika, rekli bismo da je odgovor na navedeno pitanje: potreba.

Kada se prepozna realna potreba za nečim, pronađe se i način za rešavanje problema (naravno, u granicama mogućeg; nećemo tek tako pronaći algoritam za sortiranje nizova čija je složenost O(1), ma koliko da to želimo i ma koliko da za takvim algoritmom postoji potreba).

Programski jezici visokog nivoa nastali su iz potrebe za jednostavnijim, funkcionalnijim i prirodnijim načinom zapisa programa; šablonske niske su nastale iz potrebe za boljim i prirodnijim načinom zapisa obimnijih kombinovanih niski.

Lepota programiranja je u tome, što nam omogućava da ostvarimo velike ideje pod uslovom da "samo" uložimo odgovarajuću količinu truda (često poveću količinu truda, ali tako izgleda mora biti) - a to je drugačije od većine drugih aktivnosti, gde ostvarivanje velikih ideja često zahteva i velika materijalna ulaganja.

Tema za razmišljanje ....

Autor članka Nikola Vukićević Za web portal www.codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu www.codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta www.codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2023. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna Početna > Članci > Šablonske niske u programskim jezicima

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 23.05.2021.

trejler_dokument Jezici: JavaScript,
PHP
C#

trejler_teg_narandzasti Težina: 7/10

Povezani članci

Povezani članci

Svi članci
So if you want to go fast, if you want to get done quickly, if you want your code to be easy to write, make it easy to read.
Robert C. Martin
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu www.codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta www.codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2023. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt