# "subst"

**URL:** <https://www.ruby-forum.com/t/subst/115591>\
**Category:** IT\
**Created:** [September 26, 2007, 5:37pm UTC](https://www.ruby-forum.com/t/subst/115591 "2007-09-26T17:37:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 26, 2007, 5:37pm UTC](https://www.ruby-forum.com/t/subst/115591/1 "2007-09-26T17:37:26Z")

</div>

Mi manca una cosa da Tcl - quando ho una stringa “$foo bar”, posso fare

set foo “blah”  
set result [subst $str]

e result == “blah bar”

Non trovo un metodo interpolate per le stringhe in Ruby… c’e` un  
modo di fare questa cosa?

---

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 26, 2007, 6:25pm UTC](https://www.ruby-forum.com/t/subst/115591/2 "2007-09-26T18:25:31Z")

</div>

On Wed, 26 Sep 2007 17:36:25 +0200  
“David W.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Mi manca una cosa da Tcl - quando ho una stringa “$foo bar”, posso fare
> 
> set foo “blah”  
> set result [subst $str]
> 
> e result == “blah bar”
> 
> Non trovo un metodo interpolate per le stringhe in Ruby… c’e` un  
> modo di fare questa cosa?

forse puoi usare eval?

str = ‘#{foo} bar’  
foo = ‘blah’  
eval(“result = str”)

–  
Aequam memento rebus in arduis servare mentem…

Mauro T. [http://www.tortonesi.com](http://www.tortonesi.com)

University of Ferrara - Dept. of Eng. [http://www.ing.unife.it](http://www.ing.unife.it)  
GNU Wget - HTTP/FTP file retrieval tool  
[Wget - GNU Project - Free Software Foundation](http://www.gnu.org/software/wget)  
Deep Space 6 - IPv6 for Linux [http://www.deepspace6.net](http://www.deepspace6.net)  
Ferrara Linux User Group [http://www.ferrara.linux.it](http://www.ferrara.linux.it)

---

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 26, 2007, 9:39pm UTC](https://www.ruby-forum.com/t/subst/115591/3 "2007-09-26T21:39:35Z")

</div>

— Mauro T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > Non trovo un metodo interpolate per le stringhe in  
> > Ruby… c’e` un  
> > modo di fare questa cosa?
> 
> forse puoi usare eval?
> 
> str = ‘#{foo} bar’  
> foo = ‘blah’  
> eval(“result = str”)

io usavo il trucco analogo:  
result = eval(%{“#{str}”})  
che necessita del %{} per contenere la stringa e delle  
virgolette perché sia trattata come literal da eval.

Certo che un String#interpolate(binding,&block)  
farebbe comodo, chi scrive una RCR? 🙂

```
  ___________________________________________________________

```

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good  
[http://uk.promotions.yahoo.com/forgood/environment.html](http://uk.promotions.yahoo.com/forgood/environment.html)

---

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 27, 2007, 10:02am UTC](https://www.ruby-forum.com/t/subst/115591/4 "2007-09-27T10:02:36Z")

</div>

Ciao tutti,

presento mi a questa lista - e scusate i miei problemi con l’Italiano,  
perché non è la mia lingua prima :-}

Comunque, per il problema di “subst”:

Io direi di usare il metodo String#sub (o String#sub!), per esempio:

str = “hello #foo#”  
str.sub(/#foo#/, “bar”)

> “hello bar”

Esiste anche una versione di sub con un block. Il primo parametro e una  
regexp, ma è semplice per questi casi.

La soluzione con eval()

> result = eval(%{“#{str}”})

… sta funzionando, ma per me non sembra ottimale riguardo a sicurezza.  
Per esempio:

str = ‘#{evil\_command()}’  
eval(%{“#{str}”}) # Uh-oh…

Quel e un problema con eval() in generale, perché può svolgere comandi  
casuali.

Ciao,  
Daniel

–  
Daniel H.  
removed\_email\_address@domain.invalid  
Net7 [http://www.netseven.it/](http://www.netseven.it/)

Discovery Project

> **[Discovery Project - The Discovery Project: Philosophy in the Digital Era?](http://www.discovery-project.eu/home.html)**
>
> symfony project

Bring Rails to Italy!  
[http://www.railstoitaly.org/](http://www.railstoitaly.org/)

---

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 27, 2007, 10:50am UTC](https://www.ruby-forum.com/t/subst/115591/5 "2007-09-27T10:50:39Z")

</div>

— Daniel H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ciao tutti,
> 
> presento mi a questa lista - e scusate i miei  
> problemi con l’Italiano,  
> perché non è la mia lingua prima :-}

non è per niente male, tranquillo 🙂

> Comunque, per il problema di “subst”:
> 
> Io direi di usare il metodo String#sub (o  
> String#sub!), per esempio:

io preferisco lasciare un placeholder:

“foo %s bar %s”

e poi usare String#%, ma ci sono casi in cui  
re-interpolare una stringa può essere molto comodo  
(i.e. template)

> Per esempio:
> 
> str = ‘#{evil\_command()}’  
> eval(%{“#{str}”}) # Uh-oh…
> 
> Quel e un problema con eval() in generale, perché  
> può svolgere comandi  
> casuali.

eval è evil lo so, ma usando un $SAFE-level \> 0 i  
problemi sono molto di meno, perché non funziona con  
stringhe tainted (i.e. comandi casuali in input).

–  
Goto 10: [http://www.goto10.it](http://www.goto10.it)  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

```
  ___________________________________________________________

```

Yahoo! Answers - Got a question? Someone out there knows the answer. Try  
it  
now.

> **[Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos](https://www.yahoo.com/)**
>
> Latest news coverage, email, free stock quotes, live scores and video are just the beginning. Discover more every day at Yahoo!

---

<div class="post-metadata">

**Author:** ![dawillis](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/ebca7d/32.png) [@dawillis](https://www.ruby-forum.com/u/dawillis)\
**Post date:** [September 27, 2007, 10:31am UTC](https://www.ruby-forum.com/t/subst/115591/6 "2007-09-27T10:31:56Z")

</div>

> presento mi a questa lista - e scusate i miei problemi con l’Italiano,  
> perché non è la mia lingua prima :-}

Non sei l’unico - infatti ho notato diversi nomi ‘non italiani’ qua, e  
la cosa mi fa piacere:-)

> Comunque, per il problema di “subst”:
> 
> Io direi di usare il metodo String#sub (o String#sub!), per esempio:

Si`, alla fine ho optato per quello.

> … sta funzionando, ma per me non sembra ottimale riguardo a sicurezza.  
> Per esempio:

Il subst di Tcl e` carino per questo:

```
   subst ?-nobackslashes? ?-nocommands? ?-novariables? string

```

Puoi dirgli di non sostituire backslashes, commandi o variabili.
