4.5. Korvautuminen

Tcl-kielessä korvautumisella (engl. substitution) tarkoitetaan jonkin komennon osan eli sanan korvautumista jollakin toisella arvolla. Korvautumista on kolmea eri tyyppiä: muuttujan korvautumista (en gl. varia ble substitution), kenoviivan avulla korvautumista (engl. backslash substitution) ja komennon korvautumista hakasulkeita käyttämällä (engl. command substitution) [WEL97W]. 

Muuttujan korvautumisella tarkoitetaan vain tavallista muuttujan arvoon viittaamista $-merkin avulla, kuten seuraavassa esimerkissä on tehty:

set sana1 "kattimatti"

set sana2 $sana1

=>kattimatti

Muuttujalle voi antaa arvoksi toisen muuttujan nimen. Tällöin pitää huomata, että muuttujan arvo on vain jokin merkkijono (tässä tapauksessa toisen muuttujan nimi), eikä sen ar voon voi vii tata $-merkin avulla. Esimerkin

set sana2 sana1

=> sana1

set sana3 $sana2

=> sana1

ensimmäisen komennon jälkeen sana2-muuttujan arvo on sana1, joten sana3-muuttujan arvoksi tulee sana1 toisen komennon jälkeen.

Jos halutaan viitata sana1-muuttujan arvoon (kattimatti) sana2-muuttuja n avulla, on käytettävä apuna komennon korvatumista hakasulkujen avulla [MOS97W]. Esimerkit

set sana3 [set [set sana2]]

=> kattimatti

ja

set sana3 [set $sana2]

=> kattimatti

ovat täsmälleen samat. Tässä on huomattava että set-komento palauttaa muuttujan arvon, joten on sama kirjoittaako $sana2 vai [s et sana2]. Hakasulkujen sisällä olevat komennot suoritetaan ensimmäisenä, jolloin hakasulut korvautuvat niiden sisällä oleva n komennon palauttamalla arvolla. Yllä olevan esimerkin ensimmäisen komennon voi aj atella kolmivaiheisesti seuraavasti:

set sana3 [set [set sana2]]

=>set sana3 [set sana1] ;#(1)

=>set sana3 kattimatti ;#(2)

=>kattimatti ;#(3)

Ensimmäisenä suoritetaan sisimmät hakasulut, jolloin [set sana2] korvautuu merkkijonolla sana1 (kohta 1 yllä olevassa esimerkissä). Tämän jälkeen [set sana1] korvautuu lopulliseksi arvoksi kattimatti (kohta 2). Lopulta suoritetaan jäljelle jäänyt komento set sana3 kattimatti (kohta 3).

Seuraava esimerkki kuvaa hakasulkujen ja $-merkin käytöä:

set kille "heipä"

set kalle "hei"

set killekalle "moimoi"

set jokunen "$killekalle"

=>moimoi

set jokunen "[set kille]kalle"

=> heipäkalle

set jokunen "$kille$kalle"

=> heipähei

set summa [expr 1+1]

=> 2

Viimeisessä esimerkissä expr-komento antaa tuloksen sille parametrina annetusta lausekkeesta 1+1. Lausekkeessa oli k äytetty +-ope raattoria. Kaikki Tcl-kielen operaattorit on listattu taulukossa 4.3.

Kenoviivalla voi esimerkiksi saada muuttujan arvoksi merkkijonon, joka sisältää $-merkin. Esimerkissä

set dollari_kikkailu "rahaa 5\$dollarimerkki"

=> rahaa 5$dollarimerkki 

kenoviivan jälkeisen $-merkin erikoismerkitys jätetään huomioimatta, jolloin \$ korvautuu pelkäll ä $-merkillä.

Kenoviiva ja sen jälkeinen merkki korvautuvat jälkimmäiseksi merkiksi, joten esimerkiksi kenoviiva saadaan laittamalla kaksi kenoviivaa peräkkäin. Poikkeuksen tekevät tietyt kirjaimet yhdessä kenoviiva n kanssa, joilla on erikoismerkitys. Esimerkiksi \n tarkoittaa rivinvaihtoa (engl. newline). Seuraavassa esimerkissä on yritetty hieman valaista lukijalle kenoviivan avulla korvautumista.

set sekametelisoppa "Keno \\ ja kautta / ja \dollari\$ \ \ntoiselle riville hipsu \" "

=> Keno \ ja kautta / ja dollari$

toiselle riville hipsu "

Yllä kenoviiva ennen dollarimerkkiä tulkitaan vain yhdeksi välilyönniksi. On aivan sama, onko kyseisen kenoviivan jälkeiset sanat kirjoitettu vasta seuraavalla riville, koska yksittäinen kenoviivahan on rivin jatkumisen merkki.

Käyttämällä kaarisulkeita (engl. braces), voidaan estää kaikentyyppiset korvautumiset. Kaarisulkeet aiheuttavat sen, että sulkeiden sisältö annetaan sellaisenaan komennolle, eikä korvautumisia tehdä. Tällä tavalla voidaan komennoille (esimerkiksi aliohjelmille) antaa isoja kokonaisuuksia parametreina.

Esimerkissä

set sekametelisoppa {Keno \\ dollari \$ \n hipsu \"}

=> Keno \\ dollari \$ \n hipsu \"

ei kaarisulkeiden sisällä tapahdu yhtään korvautumista.


previous gif next gif


Luk-tutkielma: Tcl/Tk -opiksi ja iloksi.