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.