Una hash, come abbiamo già avuto modo di discutere, è una specie di array, in cui però l'indice usato per la catalogazione non è numerico, ma è una stringa di caratteri; si effettua allora un immagazzinamento di informazioni sotto forma di chiave-valore, che in qualche misura assomiglia al modo con cui si organizza il più rudimentale dei database. Se state pensando a database complessi, relazionali, professionali, siete fuori strada: le funzionalità di database che Perl offre automaticamente, senza appoggiarsi a prodotti esterni, sono estremamente rudimentali, ma in alcune situazioni possono essere sufficienti.
Aprite il vostro editor di testo preferito e digitate il seguente codice:
#!/usr/bin/perl
while()
{
my $scelta=&SceltaMenu;
if($scelta==1)
{
&InserisciNota;
}
elsif($scelta==2)
{
&MostraNote;
}
elsif($scelta==3)
{
&CancellaNote;
}
elsif($scelta==0)
{
last;
}
}
sub SceltaMenu
{
print "\n";
print "1.\tInserisci una nuova nota\n";
print "2.\tMostra le note\n";
print "3.\tCancella note\n";
print "\n";
print "0.\tEsci\n";
print "\n";
print "Inserisci la tua scelta: ";
return <STDIN>;
}
sub InserisciNota
{
print "\n";
print "Inserisci una nuova nota: ";
my $nota=<STDIN>;
my $data=&InserisciData;
&AggiornaDatabase($data,$nota);
}
sub MostraNote
{
print "\n";
my $data=&InserisciData;
my $nota=&LeggiDatabase($data);
print "\n";
print "Note per $data: $nota\n";
}
sub CancellaNote
{
print "\n";
my $data=&InserisciData;
&AggiornaDatabase($data,"");
}
sub InserisciData
{
my $data=`date +"%d-%m-%Y"`;
chomp $data;
print "Data [$data]: ";
my $d=<STDIN>;
chomp $d;
$data=$d if $d ne "";
return $data;
}
sub AggiornaDatabase
{
my ($d,$n)=@_;
dbmopen(my %DB,"note",0644) or die "Impossibile accedere al database!\n";
if($d eq "")
{
delete($DB)
}
else
{
$DB=$n;
}
dbmclose(%DB);
}
sub LeggiDatabase
{
my ($d)=@_;
dbmopen(my %DB,"note",0644) or die "Impossibile accedere al database!\n";
my $n=$DB;
dbmclose(%DB);
return $n;
}
Salvatelo col nome che volete e rendetelo eseguibile. Se provate ad eseguirlo, il funzionamento dovrebbe essere abbastanza chiaro: un menu vi permette di optare per l'inserimento, la visualizzazione o la cancellazione di una nota. Le note sono identificate per data (in realtà la chiave può essere una stringa qualunque, di default viene proposta la data corrente, se non si scrive niente la proposta di default viene accettata), e per semplicità una sola nota per ogni data è consentita. Il database contenente le note inserite viene mantenuto da un'esecuzione all'altra del programma, ovvero i dati che inserite vengono in qualche modo salvati su disco. Complimenti, avete realizzato un rudimentale "blocco note".my $stringa=pack("a20 i f","Marco Coisson",32,1.81);
Questa funzione accetta, come primo argomento, una stringa di formato; essa è costituita da una sequenza di lettere (eventualmente seguite da numeri) separate da spazi. Una lettera a indica una stringa di testo, composta al massimo da tanti caratteri quanti sono indicati nel numero immediatamente successivo (così a20 indica una stringa avente al massimo 20 caratteri), una i indica un numero intero, una f indica un numero decimale; ci sono moltissime altre lettere utilizzabili per indicare il formato, per maggiori informazioni digitate man perlfunc dal Terminale e preparatevi ad una lunga lettura. Così, stabilito il formato, gli argomenti successivi corrisponderanno ad uno ad uno alle varie lettere di formato riportate nella stringa a primo argomento. La funzione pack(), allora, prende, nell'esempio riportato, una stringa di testo avente al massimo 20 caratteri (il mio nome), un numero intero (la mia età) e un numero decimale (la mia altezza in metri) e li "impacchetta" in modo che siamo memorizzati all'interno di un'unica variabile, $stringa nel nostro esempio. Potremo così usare questa variabile come valore di una hash, normale o associata ad un file, per memorizzare più informazioni sotto un'unica chiave. Quando si tratterà di recuperare queste informazioni, la funzione unpack() svolgerà egregiamente il suo compito:
my ($nome,$eta,$altezza)=unpack("a20 i f",$stringa);
Essa restituisce una lista, associabile direttamente a delle variabili racchiuse tra parentesi tonde e separate da virgole, o ad un'array, in ragione di una variabile per ogni elemento che fa parte del formato specificato. Va da sé che è indispensabile che la stringa di formato usata con unpack() sia esattamente la stessa che è stata usata con pack(), se no i risultati saranno quanto meno bizzarri!