16.06.2013 Views

2 - Amiga Magazine Online

2 - Amiga Magazine Online

2 - Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Com'è noto, <strong>Amiga</strong>Shell offre la sintassi:<br />

per estrarre il valore della variabile x. Forse,<br />

però, è meno noto che due altri comandi<br />

consentono di accedere al valore delle va-<br />

riabili: si tratta di GetErrv e GeZ, rispettiva-<br />

mente per le variabili ambiente (assegnate<br />

con SetEnv) e per quelle locali alla Shell<br />

(assegnate con Set). Entrambi questi co-<br />

mandi "stampano" il valore del loro argo-<br />

mento, interpretato come un nome di varia-<br />

bile, cosicché:<br />

get x<br />

è equivalente a:<br />

echo Cx<br />

Probabilmente gli ingegneri della Commo-<br />

dore, nell'implementare questi comandi,<br />

hanno soltanto seguito lo spirito di simme-<br />

tria rispetto ai comandi "Set", ma un piace-<br />

vole effetto collaterale della loro disponibi-<br />

lità è la possibilità di creare e gestire dei<br />

veri e propri array con la Shell!<br />

Il trucco è piuttosto semplice: si tratta di<br />

comporre il nome di una variabile per mez-<br />

zo di altre variabili, approfittando del fatto<br />

che "$" e i comandi SetIGet vengono valu-<br />

tati in tempi diversi. Un esempio chiarirà<br />

subito questa tecnica: supponiamo di voler<br />

gestire un array di nome a, a contenuto nu-<br />

rnerico, con indici da O a 9. 11 nostro "array"<br />

sarà costituito da 10 variabili, di nome<br />

a0 ... a9, ciascuna delle quali conterrà un e-<br />

lemento dell'array. Naturalmente, I'accesso<br />

con indice costante è del tutto banale:<br />

set a3 15<br />

. . .<br />

echo $a3<br />

ma anche I'accesso con indice variabile è<br />

relativamente semplice:<br />

set i 3<br />

set a$i 15<br />

64 ~ I G ~GAZINE<br />

A<br />

N" 9310llOBRE 1997<br />

. . .<br />

get a$i<br />

In questo esempio, Get stampa il valore<br />

della variabile a3 (ovvero 15) nella finestra<br />

della Shell, ma è altrettanto semplice usarlo<br />

per altri scopi, grazie al "backtick": per e-<br />

sempio,<br />

set x 'get a$i'<br />

Questa tecnica può essere usata in unione<br />

ai cicli, che abbiamo visto nell'ultima punta-<br />

ta, per inizializzare o elaborare interi array.<br />

Come semplice estensione, è possibile ge-<br />

stire array a più dimensioni, per esempio:<br />

set i l<br />

set j 1<br />

set a$ix$j 15<br />

in cui abbiamo usato la lettera "x" per se-<br />

parare gli indici; naturalmente, qualunque<br />

altra convenzione andrebbe bene. Ricor-<br />

date però che la Shell accetta negli identifi-<br />

catori soltanto i caratteri alfabetici e numeri-<br />

ci; per usare altri simboli, come I'undersco-<br />

re, è necessario racchiudere tutto il nome<br />

fra parentesi graffe:<br />

set al-l 15<br />

. . .<br />

echo ${al-l]<br />

Diverso è il caso in cui si abbia bisogno di<br />

più livelli di indirezione, ovvero quando I'in-<br />

dice di un array sia a sua volte un elemento<br />

di un array. In questi casi, sarà giocoforza<br />

fare uso di variabili di appoggio tempora-<br />

nee, come nell'esempio seguente, in cui<br />

viene simulata l'operazione x=a[b[fl di altri<br />

linguaggi:<br />

set tmp 'get b$i'<br />

set x 'get a$@'<br />

In questo caso, come nei precedenti, l'uso<br />

del comando Set senza argomenti permet-<br />

te di esaminare un "dump" di tutte le varia-<br />

bili definite e dei rispettivi valori.<br />

Potete rendervi conto facilmente che il con-<br />

tenuto degli array non deve essere neces-<br />

sariamente numerico; più interessante è<br />

però riflettere sul fatto che neppure l'indice<br />

deve essere numerico: nulla vieta, infatti,<br />

che la variabile i nel nostro primo esempio<br />

rappresenti una stringa anziché un intero.<br />

Questa osservazione conduce direttamen-<br />

te all'uso degli array associativi; array<br />

che mettono in relazione fra di loro due<br />

stringhe. Gli array di questo tipo sono simili<br />

agli "stem" del REXX, e permettono di rea-<br />

lizzare semplici "database" che possono<br />

semplificare alquanto la programmazione.<br />

L'esempio classico per questi array è quel-<br />

lo dell'agenda telefonica: in un altro lin-<br />

guaggio di programmazione, sarebbe ne-<br />

cessario scrivere routine di ricerca (più o<br />

meno complesse) di un nome nell'array pri-<br />

ma di poter reperire il numero di telefono<br />

relativo; usando gli array associativi tutto si<br />

riduce a qualcosa come<br />

che pone in n il numero telefonico di Carlo.<br />

Nel nostro caso, si avranno comandi simili<br />

ai seguenti:<br />

; per memorizzare<br />

set nome Carlo<br />

set TEL$nome 553248<br />

; per reperire<br />

get TELCarlo<br />

; Rubrica telefonica<br />

; - Mernorizzazione -<br />

echo "Nominativo: " NOLINE<br />

set >NIL: nome ?<br />

echo "Numero : " NOLINE<br />

setenv >NIL: TEL/$nome ?<br />

if not exists ENVARC:TEL<br />

makedir ENVARC:TEL<br />

endif<br />

copy ENV:TEL/$nome ENVARC:TEL<br />

Listato 1.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!