From 509cde8e3c01c020a92bb60901f8861eaa2d5de1 Mon Sep 17 00:00:00 2001
From: dakkar <dakkar@luxion>
Date: Sat, 9 Aug 2008 12:42:20 +0000
Subject: fatti gli hash

git-svn-id: svn://luxion/repos/intro-perl@353 fcb26f47-9200-0410-b104-b98ab5b095f3
---
 corso.content.tex | 178 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 177 insertions(+), 1 deletion(-)

(limited to 'corso.content.tex')

diff --git a/corso.content.tex b/corso.content.tex
index 623b4c2..297cf47 100644
--- a/corso.content.tex
+++ b/corso.content.tex
@@ -668,6 +668,16 @@ unshift @a,
 \end{frame}
 %$
 
+\begin{frame}[fragile]\frametitle{\texttt{reverse}}
+\begin{lstlisting}
+my @a=(1..10);
+my @b=reverse @a;
+print @b;
+\end{lstlisting}
+
+\visible<2->{\lstinline!10987654321!}
+\end{frame}
+
 \subsection{Interpolazione}
 
 \begin{frame}[fragile]\frametitle{Interpolazione}
@@ -794,12 +804,178 @@ chomp(@linee); # toglie tutti gli "a capo"
 
 \section{Hash}
 
-\subsection{Indici}
+\begin{frame}\frametitle{Cos'� un hash?}
+\begin{itemize}
+\item una mappa tra {\em stringhe} e valori {\em scalari}
+\item un po' come gli array, ma i singoli elementi sono indicati con una stringa (``chiave'') invece che con la loro posizione
+\item gli hash non sono ordinati
+\end{itemize}
+\end{frame}
+
+\subsection{Chiavi}
+
+\begin{frame}[fragile]\frametitle{Accesso ad elemento}
+\begin{itemize}
+\item \lstinline!$altezza{'dakkar'}=1.72!
+\item \lstinline!$altezza{$persona}=$altezza!
+\end{itemize}
+
+Il valore corrispondente a una chiave cui non � mai stato assegnato
+nulla � \lstinline!undef!.
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Sintassi abbreviata per le chiavi}
+\begin{itemize}
+\item \lstinline!$altezza{'dakkar'}! e \lstinline!$altezza{dakkar}! indicano lo stesso elemento
+\item se le cose tra \lstinline!{}! non sembrano essere un'espressione, sono trattate come una stringa
+\item usate le virgolette in caso di dubbio
+\end{itemize}
+\end{frame}
 
 \subsection{Valori}
 
+\begin{frame}[fragile]\frametitle{Variabili hash}
+\begin{itemize}
+\item \lstinline!%altezza! indica l'intero hash
+\item notare che \lstinline!$nome!, \lstinline!@nome! e \lstinline!%nome! sono variabili diverse %$
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Assegnamento a hash}
+\begin{lstlisting}
+my %traccia_in=('X','corso','Y','avanzati');
+
+print "$traccia_in{X}\n";
+\end{lstlisting}
+
+\visible<2->{\lstinline!corso!
+
+A un hash si assegna una lista chiave-valore. Notare che l'accesso a elemento di hash � interpolabile.}
+\end{frame}
+%$
+
+\begin{frame}[fragile]\frametitle{Assegnamento a hash (2)}
+\begin{lstlisting}
+my %traccia_in=('X','corso',
+                'Y','avanzati','Y','GUI');
+
+print "$traccia_in{Y}\n";
+\end{lstlisting}
+
+\visible<2->{\lstinline!GUI!
+
+Se una chiave appare pi� volte nella lista assegnata al hash, vale l'ultima.}
+\end{frame}
+%$
+
+\begin{frame}[fragile]\frametitle{Hash come lista}
+\begin{lstlisting}
+my %traccia_in=('X','corso','Y','avanzati');
+my @tracce=%traccia_in;
+
+print "@tracce\n";
+\end{lstlisting}
+
+\visible<2->{\lstinline!Y avanzati X corso!
+
+Notare che l'ordine � arbitrario: gli hash non sono ordinati.}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Trasporre un hash}
+\begin{lstlisting}
+my %traccia_in=('X','corso','Y','avanzati');
+my %stanza_per=reverse %traccia_in;
+
+print "$stanza_per{avanzati}\n";
+\end{lstlisting}
+
+\visible<2->{\lstinline!Y!
+
+Con \lstinline!reverse! trasformiamo la lista chiave-valore in una lista valore-chiave, per cui trasponiamo l'hash.
+
+Se i valori in \lstinline!\%traccia_in! non fossero univoci, il valore di \lstinline!\%stanza_per! sarebbe mal definito.
+}
+\end{frame}
+%$
+
+
+\begin{frame}[fragile]\frametitle{Sintassi alternativa}
+\begin{lstlisting}
+my %traccia_in=( X => 'corso',
+                 Y => 'avanzati');
+\end{lstlisting}
+
+\begin{itemize}
+\item stesso valore di prima
+\item \lstinline!=>! � come una virgola
+\item ma quel che viene prima viene trattato come una stringa (a meno che non sembri un'espressione)
+\end{itemize}
+\end{frame}
+
 \subsection{Funzioni}
 
+\begin{frame}[fragile]\frametitle{\texttt{keys} e \texttt{values}}
+\begin{itemize}
+\item \lstinline!keys %a! restituisce la lista delle chiavi in \lstinline!%a!, {\em in un qualche ordine arbitrario}
+\item \lstinline!values %a! restituisce la lista dei valori in \lstinline!%a!, {\em nello stesso ordine di \lstinline!keys!}
+\item in contesto scalare, restituiscono il numero di chiavi (o valori, � lo stesso)
+\item per sapere se un hash � vuoto o meno, invece di controllare \lstinline!keys %a!, basta controllare \lstinline!%a!: un hash � vero se e solo se � non-vuoto
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{each}}
+\begin{lstlisting}
+my %hash=( a => 1, b => 2, c => 3 );
+while (my ($chiave,$valore) = each %hash) {
+  print "Alla chiave $chiave",
+        " corrisponde $valore\n";
+}
+\end{lstlisting}
+
+\lstinline!each! visita l'hash in ordine arbitrario, restituendo ad ogni invocazione una nuova coppia chiave-valore; restituisce lista vuota (quindi un valore falso) alla fine.
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{exists} e \texttt{defined}}
+\begin{itemize}
+\item \lstinline!exists $hash{chiave}! restituisce vero se l'hash
+contiene quella chiave (qualunque ne sia il valore)
+\item \lstinline!defined $hash{chiave}! restituisce vero se il valore
+corrispondente a quella chiave � definito (questo � il funzionamento
+normale di \lstinline!defined!)
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Nota su esistenza etc.}
+Notare la differenza:
+
+\begin{lstlisting}
+my %a=( vero => 1,
+        falso => 0,
+        non_definito => undef);
+\end{lstlisting}
+
+\begin{itemize}
+\item \lstinline!$a{vero}! � vero
+\item \lstinline!$a{falso}! � falso
+\item \lstinline!$a{non_definito}! � falso
+\item \lstinline!exists $a{non_definito}! � vero
+\item \lstinline!defined $a{falso}! � vero
+\item \lstinline!exists $a{non_ce}! � falso
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{delete}}
+\begin{lstlisting}
+my %hash=( a => 1, b => 2, c => 3 );
+delete $hash{a};
+if (!exists $hash{a}) {
+  print "ok\n";
+}
+\end{lstlisting}
+
+\lstinline!delete! elimina un elemento da un hash.
+\end{frame}
+
 \section{Subroutine}
 
 \subsection{Definizione}
-- 
cgit v1.2.3

