# Perl/Variabili hash

Perl
Copertina Bibliografia Tutti i moduli · Sviluppo
    CopertinaPerl/Copertina
* IntroduzionePerl/Introduzione
* C'è Perl?Perl/C'è Perl?
* Primo programma: Ciao Mondo!Perl/Primo programma: Ciao Mondo!
** Primo programma in un filePerl/Primo programma in un file
* VariabiliPerl/Variabili
** Variabili scalariPerl/Variabili scalari
** Variabili vettoriPerl/Variabili vettori
** Variabili hashPerl/Variabili hash
* IstruzioniPerl/Istruzioni
** Istruzioni minimePerl/Istruzioni minime
** Istruzioni compostePerl/Istruzioni composte
** Istruzioni racchiuse o bloccoPerl/Istruzioni racchiuse o blocco
** Istruzioni etichettaPerl/Istruzioni etichetta
** Istruzioni particolari su blocchi o etichettePerl/Istruzioni particolari su blocchi o etichette
** Istruzioni decisionaliPerl/Istruzioni decisionali
** CicliPerl/Cicli
* Applicare la teoriaPerl/Applicare la teoria
* FunzioniPerl/Funzioni
* Funzioni Native sulle variabiliPerl/Funzioni Native sulle variabili
** Funzioni Native su scalariPerl/Funzioni Native su scalari
** Funzioni Native su vettoriPerl/Funzioni Native su vettori
** Funzioni Native su hashPerl/Funzioni Native su hash
* FilePerl/File
* Espressioni regolariPerl/Espressioni regolari
** Espressioni regolari (oltre)Perl/Espressioni regolari (oltre)
** Espressioni regolari (contesto)Perl/Espressioni regolari (contesto)
Modifica il sommario
Gli array associativi o hash si possono immaginare come dei vettori che hanno i vagoni individuati da "un nome", piuttosto che da un numero. Analogamente agli array, quindi, rappresentano un insieme di scalari; a differenza dei vettori, in cui nel treno le carrozze sono numerate, negli hash, per identificare un'informazione, si usa un "nome". Non esiste però alcun modo di legare l'ordine di immissione dei dati e il loro successivo recupero. L'unica garanzia è che ogni "nome" assegnato al un vagone (chiave-key) corrisponde uno ed un unico valore (valore-value).

### Il nome

Come per le variabili scalari, lo stesso si può dire per i nomi degli hash. Per identificare una variabile hash, occorre anteporre al nome il carattere %. Il nome di una variabile DEVE iniziare con "lettere", "_" , "'", mentre dal secondo carattere oltre ai precedenti si possono usare i "numeri" fino ad un massimo di 256 caratteri. Infine, essendo un linguaggio "case sensitive", le lettere maiuscole vengono considerate differenti dalle lettere minuscole.
NOTA: il nome di una variabile non può iniziare con numeri !!!

### Il contenuto

Il contenuto è un qualsiasi scalare.
A differenza del vettore, l'hash è un elemento che associa ad UNA stringa (detta chiave) UN valore. Quindi non è possibile avere più chiavi con lo stesso nome nello stesso hash.
Vediamo la sintassi per creare un hash:
In questo modo ho associato alla chiave mario => il valore maria , alla chiave giancarlo => il valore giancarla e alla chiave carmelo => il valore carmela.
NOTA: Per definire un hash si usa un vettore. Tuttavia mentre un vettore è una "fila" di valori, l'hash è una associazione chiave => valore.
Per ottenere il valore associato ad una chiave si usa questa forma:
che mostrerà "maria". Come si può notare il costrutto $a{<nome>} non è equivoco ed identifica in modo assoluto l'unico valore associato a <nome>. Da notare che i sigilli rimangono coerenti : l'elemento associato a <nome> è uno scalare !!!.
Ricordo nell'hash non è possibile attribuire più di un valore ad una stessa chiave, quindi le chiavi sono univoche dentro uno stesso hash

### Gestire gli array associativi

Abbiamo detto che gli array associativi usano "key" associate a "value". Vediamo ora come "gestire" queste entità.
Per ottenere l'elenco delle chiavi si usa keys
che torna l'elenco di tutte le chiavi che compongono %a. Da notare che è sicuro che ci siano tutte le chiavi ma l'ordine non è mai assicurato.
Per ottenere i valori si usa values
che torna l'elenco di tutti i valori che compongono %a. Da notare che è sicuro che ci siano tutti i valori ma l'ordine non è mai assicurato.
entrambe queste funzioni ritornano un array composto di tutte le informazioni richieste di %a (key o value).
Vediamo ora un'istruzione che, ogni volta che viene invocata, ritorna un elemento dell'array associativo:
($key, $value) = each %a;
Vediamo questo esempio:
che scriverà ogni chiave valore presente in %contact. Da notare che è sicuro che ogni volta "each" torni un nuovo valore presente in %contact ma l'ordine non è mai assicurato.

#### exists e delete

Queste due funzioni consentono:
* di verificare se un certo dato esiste
* di poter cancellare un certo dato.
Quindi usando exists è possibile verificare la presenza di una chiave:
che mostrerà:
Mentre, usando delete, come per gli array, è possibile togliere una corrispondenza chiave => valore :
che mostrerà:

### Notazione { x , y , z }

Come per i vettori, anche per gli hash esiste una notazione che consente di trattare più informazioni su uno stesso hash.
che mostrerà:
DA NOTARE che, nel secondo assegnamento, il sigillo di lettere è cambiato da % a @: dato che si tratta di più valori ($lettere{e},$lettere{f},$lettere{g}) è obbligatorio mettere @ e non %. Se ci si riflette un attimo l'array ( 'E' , 'F' , 'G' ) contiene solo i valori e deve corrispondere ad un array.Nel caso ci fosse stato il sigillo % le chiavi devono essere nell'array di destra.

### Dopo tanta teoria un po' di pratica

Vediamo ora una soluzione ottenibile con le informazioni finora trattate.
ESEMPIO1 Assegnare ad un hash i numeri da 1 a 12 e i corrispondenti mesi.
Soluzione1 - esplicita -
Soluzione2 - dall'esempio degli array -
Soluzione3 - al risparmio -
ESEMPIO2 Scrivere il dato (nome mese) corrispondente alla chiave (posizione, numero) 3.
nota: il terzo mese ha le informazioni associate alla chiave '3' e non è più importante la posizione come per gli array.
ESEMPIO3 Dato l'array precedente scrivere i dati relativi al mese numero 3 nella seguente forma:"il mese " il numero del mese seguito da "ha il nome :" il relativo nome.

# Riassunto

Gli hash:
* sono identificati dal sigillo "%" davanti al nome
* contengono valori scalari associati a chiavi (stringhe)
* si ottengono/assegnano i dati (scalari) utilizzando la sintassi $'nome'{'posizione'}
* si utilizzano le funzioni keys , values avere l'elenco degli elementi
* si utilizza la funzione exists per sapere se c'è una chiave.