Archive

Posts Tagged ‘tupla’

Configuration file in Erlang

September 26, 2009 1 comment

Quando scrivete un progetto in erlang, grande o piccolo che sia, vi troverete davanti alla necessità di spostare con il codice hard-coded in un foglio di configurazione, che l’utente avrà la possibilità di modificare a piacere.

In erlang tutto ciò è molto semplice, tanto da poter essere implementato in poche righe di codice.

Iniziamo creando un file di configurazione che metteremo nella directory di Unix /etc/software/software.cfg

Possiamo creare tale file usando il comando vim dalla shell di Unix, oppure un qualsiasi editor di testo (nota bene che la cartella /etc/ è di solito di proprietà dell’utente root, quindi o eseguite tali comandi come tale utente, o cambiate directory con una vostra directory locale.

pegaso:~ bellerofonte$ sudo mkdir /etc/software
pegaso:~ bellerofonte$ sudo vim /etc/software/software.conf

E qui editate il file aggiungendo i parametri che vi pare (i miei rappresentano il mio blog), seguendo però la seguente forma:

{nome, "Paolo D'Incau's Blog"}.
{url, "https://pdincau.wordpress.com/"}.
{framework, "WordPress"}.

Ogni campo viene identificato con una tupla a due campi: il primo è un atom che identifica la tupla (tag), mentre il secondo è il valore associato a tale tag e può essere un qualsiasi tipo erlang (lista, tupla, atom etc etc).

E’ importante che mettiate il punto alla fine di ogni riga e che controlliate che ogni tupla sia corretta nella sintassi.

Ora come carichiamo tali tali nel nostro codice erlang?

Ecco la risposta:

>1 {ok, Conf} = file:consult("/etc/software/software.cfg").
{ok,[{nome,"Paolo D'Incau's Blog"},
     {url,"https://pdincau.wordpress.com/"},
     {framework,"WordPress"}]}

Come vedete il risultato della funzione consult/1 del modulo file è una tupla. Nel caso tutto sia giusto, tale tupla sarà composta dall’atom ok e dalla lista dei valori nel file di configurazione.

Io metto {ok, Conf} confidente nel fatto che facciate tutto giusto, ma se cosi non fosse otterreste questo errore:

>1 {ok, Conf} = file:consult("/etc/software/software.cfg").
** exception error: no match of right hand side value {error,enoent}

Ok, ora come recuperiamo tra questi valori un singolo valore che ci interessa?
Ecco una possibile soluzione:

4> lists:keysearch(nome, 1, Conf).
{value,{nome,"Paolo D'Incau's Blog"}}

In questo caso ho utilizzato la funzione keysearch/3 del modulo lists. Essa prende in ingresso, una tag, un intero (che rappresenta quale posizione della tupla deve avere tale tag) e una lista di tuple.

Categories: Erlang Tags: , , , ,