summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@luxion>2008-08-08 12:05:55 +0000
committerdakkar <dakkar@luxion>2008-08-08 12:05:55 +0000
commitcdc16411ad7545c58045f15e701930157b049a24 (patch)
treec09dc4663608d3592aad9d46f3099ea68b49ba05
parentvariabili, i/o (diff)
downloadintro-perl-cdc16411ad7545c58045f15e701930157b049a24.tar.gz
intro-perl-cdc16411ad7545c58045f15e701930157b049a24.tar.bz2
intro-perl-cdc16411ad7545c58045f15e701930157b049a24.zip
array, manca il contesto
git-svn-id: svn://luxion/repos/intro-perl@351 fcb26f47-9200-0410-b104-b98ab5b095f3
-rw-r--r--corso.content.tex301
1 files changed, 299 insertions, 2 deletions
diff --git a/corso.content.tex b/corso.content.tex
index e42f822..0a71925 100644
--- a/corso.content.tex
+++ b/corso.content.tex
@@ -6,7 +6,7 @@
\usepackage{listings}
\usepackage{tikz}
-\lstset{numbers=left,numberstyle=\tiny ,numbersep=5pt,language=Perl,printpod=true,showspaces=false,frame=single,framerule=0pt,backgroundcolor=\color{black!20},basicstyle=\small\ttfamily}
+\lstset{extendedchars,numbers=left,numberstyle=\tiny ,numbersep=5pt,language=Perl,printpod=true,showspaces=false,frame=single,framerule=0pt,backgroundcolor=\color{black!20},basicstyle=\small\ttfamily}
\mode<presentation>
{
@@ -370,6 +370,8 @@ Stringhe tra virgolette doppie {\em interpolano} le variabili:
\item \lstinline!$msg="Totale: \$quanti pezzi"! \visible<2->{$\rightarrow$ \lstinline!Totale: $quanti pezzi!}
\item \lstinline!$misura=7.5;$etichetta="${misura}cm"! \visible<2->{$\rightarrow$ \lstinline!7.5cm!}
\end{itemize}
+
+Usate le graffe intorno al nome per evitare che i caratteri che seguono vengano interpretati come parte del nome.
\end{frame}
\subsection{Input/Output} % print, <>, chomp
@@ -406,18 +408,311 @@ Adesso \lstinline!$riga! non contiene più il carattere di ``a capo''
\subsection{\texttt{if} e \texttt{while}} % else, elsif
+\begin{frame}[fragile]\frametitle{Esecuzione condizionale}
+\begin{overprint}
+\onslide<1|handout:0>
+\begin{lstlisting}
+if ($totale > $SOGLIA_SPEDIZIONE_GRATIS) {
+ print "Spedizione: gratis\n"
+}
+\end{lstlisting}
+\onslide<2|handout:0>
+\begin{lstlisting}
+if ($totale > $SOGLIA_SPEDIZIONE_GRATIS) {
+ print "Spedizione: gratis\n"
+}
+else {
+ print "Spedizione: costa\n";
+}
+\end{lstlisting}
+\onslide<3|handout:1>
+\begin{lstlisting}
+if ($totale > $SOGLIA_SPEDIZIONE_GRATIS) {
+ print "Spedizione: gratis\n"
+}
+elsif ($totale < $SOGLIA_MINIMA_ORDINE) {
+ print "Compra di più!";
+}
+else {
+ print "Spedizione: costa\n";
+}
+\end{lstlisting}
+\end{overprint}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Cicli condizionali}
+\begin{lstlisting}
+my $quanti=0;
+while ($quanti < 10) {
+ $quanti++;
+ print "Siamo a $quanti\n";
+}
+\end{lstlisting}
+\end{frame}
+
\subsection{Valori particolari} % undef, true/false, defined
+\begin{frame}[fragile]\frametitle{\texttt{undef}}
+\begin{itemize}
+\item una variabile cui non è mai stato assegnato nulla ha valore \lstinline!undef!
+\item \lstinline!undef! ha valore numerico \lstinline!0! e valore stringa \lstinline!''! (stringa vuota)
+\item usare \lstinline!undef! in un'espressione genera un warning
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{defined}}
+\begin{lstlisting}
+my $a;
+# fai qualcosa...
+
+if (defined $a) { print "\$a non è definita\n" }
+else { print "\$a ha valore «$a»\n" }
+\end{lstlisting}
+\end{frame}
+%$
+
+\begin{frame}[fragile]\frametitle{Vero e falso}
+\begin{itemize}
+\item i seguenti valori sono considerati {\em falsi}:
+ \begin{itemize}
+ \item \lstinline!0! (il numero zero)
+ \item \lstinline!''! (la stringa vuota)
+ \item \lstinline!'0'! (la stringa che contiene il singlo carattere ``cifra zero'')
+ \item \lstinline!undef!
+ \end{itemize}
+\item tutti gli altri valori sono {\em veri}
+\end{itemize}
+\end{frame}
+
\section{Liste e Array}
+\begin{frame}\frametitle{Cos'è un array?}
+\begin{itemize}
+\item una sequenza di valori {\em scalari}, indicati per posizione
+\item \Perl\ distingue tra {\em singolare} e {\em plurale}
+\item liste e array sono i plurali
+\end{itemize}
+\end{frame}
+
\subsection{Indici}
+\begin{frame}[fragile]\frametitle{Indici normali}
+Gli indici in un array cominciano da 0:
+
+\begin{lstlisting}
+$persone[0]="Cino";
+$persone[1]="Dino";
+$persone[2]="Gino";
+$persone[3]="Lino";
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Uso}
+Potete usare un ``accesso ad elemento di array'' ovunque usereste uno scalare.
+
+\begin{lstlisting}
+print $persone[0],"\n";
+$totali[3]*=1.2;
+\end{lstlisting}
+
+Se usate un indice cui non avete mai assegnato nulla, il suo valore è \lstinline!undef!
+
+\visible<2->{\textbf{Nota:} gli array si ``allungano'' implicitamente}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Espressioni come indici}
+L'indice può essere una qualsiasi espressione (purché abbia un valore
+numerico).
+
+\begin{lstlisting}
+print $persone[$indice];
+$totali[$numero_ordine
+ + $mese * $ordini_mese]
+ = $totale_ordine;
+\end{lstlisting}
+\end{frame}
+%$
+
+\begin{frame}[fragile]\frametitle{Indici negativi}
+Se usate un numero negativo come indice, accedete ``dal fondo'':
+
+\begin{lstlisting}
+$persone[0]="Cino";$persone[1]="Dino";
+$persone[2]="Gino";$persone[3]="Lino";
+
+print $persone[-1]; # stampa Lino
+\end{lstlisting}
+
+Gli array non si allungano ``all'indietro'': \lstinline!$persone[-10]!
+genera un errore (ammesso che non ci siano 10 elementi)
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Ultimo indice}
+\lstinline!$#persone! è l'ultimo indice valido per le \texttt{persone}:
+
+\begin{lstlisting}
+$persone[0]="Cino";$persone[1]="Dino";
+$persone[2]="Gino";$persone[3]="Lino";
+
+print $persone[-1]; # stampa Lino
+print $persone[$#persone]; # stampa Lino
+\end{lstlisting}
+\end{frame}
+
\subsection{Valori}
+\begin{frame}[fragile]\frametitle{Liste}
+\begin{itemize}
+\item \lstinline!(1, 2, 3)!
+\item \lstinline!(1, 2, 3, )!
+\item \lstinline!('a', 'b', 'c')!
+\item \lstinline!(1, 'a')!
+\item \lstinline!()!
+\item \lstinline!(1..100)!
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{qw}}
+\lstinline!qw! crea liste, da stringhe:
+\ \\
+
+\begin{overprint}
+\onslide<1|handout:0>
+\lstinline!qw(1 2 3)!\\
+\lstinline!qw(a b c)!
+\onslide<2|handout:0>
+\lstinline!qw{1 2 3}!\\
+\lstinline!qw{a b c}!
+\onslide<3|handout:0>
+\lstinline!qw/1 2 3/!\\
+\lstinline!qw"a b c"!
+\onslide<4|handout:1>
+\lstinline!qw(1 2 3)!\\
+\lstinline!qw{a b c}!\\
+\lstinline!qw/1 2 3/!\\
+\lstinline!qw"a b c"!
+
+\end{overprint}
+\ \\
+
+\visible<4->{Potete usare i delimitatori che volete. \lstinline!qw! {\em non interpola}, nemmeno se usate le virgolette doppie come delimitatore.}
+\end{frame}
+
+\subsection{Assegnamento}
+
+\begin{frame}[fragile]\frametitle{Assegnamento tra liste}
+\begin{itemize}
+\item \lstinline!my ($nome,$cognome) =!
+\lstinline! ('Gianni','Ceccarelli');!
+\item \lstinline!($uno,$due)=($due,$uno)!
+\item \lstinline!($p[0],$p[1])=qw(a b)!
+\item \lstinline!my ($a,$b,$c)=(1,2)! \visible<2->{nota: \lstinline!$c! vale \lstinline!undef!}
+\item \lstinline!my ($a,$b)=(1..10)! \visible<2->{8 valori ignorati}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Variabili array}
+\begin{lstlisting}
+my @a=(1..10);
+print $a[3],"\n";
+\end{lstlisting}
+
+\visible<2->{
+\lstinline!4!
+}
+
+\visible<3->{Sì, \lstinline!@a! è il nome dell'intero array, ma l'accesso a elemento comincia con \lstinline!$!. Potete usare una variable array in ogni posto dove usereste una lista.}
+
+\visible<4->{Una variabile array cui non è mai stato assegnato nulla ha valore \lstinline!()! (lista vuota).}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Assegnamento, di nuovo}
+\begin{lstlisting}
+my @a=(1..10);
+my @b=(20..29);
+my @c=(100,99,@a,50,@b);
+\end{lstlisting}
+
+\visible<2->{È equivalente a \lstinline!@c=(100,99,1..10,50,20..29)!: gli array vengono appiattiti.}
+\end{frame}
+
+\subsection{Funzioni}
+
+\begin{frame}[fragile]\frametitle{\texttt{pop} e \texttt{push}}
+\begin{lstlisting}
+my @a=1..5; # 1 2 3 4 5
+my $ultimo
+ = pop @a; # 1 2 3 4
+push @a,11; # 1 2 3 4 11
+pop @a; # 1 2 3 4
+push @a,
+ 12,13,14; # 1 2 3 4 12 13 14
+\end{lstlisting}
+
+\lstinline!pop! e \lstinline!push! agiscono sulla {\em coda} dell'array.
+\end{frame}
+%$
+
+\begin{frame}[fragile]\frametitle{\texttt{shift} e \texttt{unshift}}
+\begin{lstlisting}
+my @a=1..5; # 1 2 3 4 5
+my $primo
+ = shift @a; # 2 3 4 5
+unshift @a,11; # 11 2 3 4 5
+shift @a; # 2 3 4 5
+unshift @a,
+ 12,13,14; # 12 13 14 2 3 4 5
+\end{lstlisting}
+
+\lstinline!shift! e \lstinline!unshift! agiscono sulla {\em testa} dell'array.
+\end{frame}
+%$
+
\subsection{Interpolazione}
+\begin{frame}[fragile]\frametitle{Interpolazione}
+Stringhe tra virgolette doppie {\em interpolano} le variabili, anche array:
+
+\begin{itemize}
+\item \lstinline!my @a=(1..3);$msg="Numeri: @a"! \visible<2->{$\rightarrow$ \lstinline!Numeri: 1 2 3!}
+\item \lstinline!$email="dakkar@thenautilus.net"! \visible<2->{errore!}
+\item \lstinline!$email="dakkar\@thenautilus.net"! \visible<2->{ok}
+\item \lstinline!$email='dakkar@thenautilus.net'! \visible<2->{ok}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Interpolazione di espressioni}
+Si possono interpolare anche gli accessi ad elemento:
+
+\begin{itemize}
+\item \lstinline!my @a=(1..3);$msg="Numero: $a[1]"! \visible<2->{$\rightarrow$ \lstinline!Numero: 2!}
+\item \lstinline!my $a=5;$msg="[boh]$a[1]"! \visible<2->{errore!}
+\item \lstinline!my $a=5;$msg="[boh]${a}[1]"! \visible<2->{ok}
+\end{itemize}
+\end{frame}
+
\subsection{\texttt{foreach}}
+\begin{frame}[fragile]\frametitle{Cicli su liste}
+\begin{lstlisting}
+foreach my $fratello (qw(Cino Dino Gino Lino)) {
+ print "Un fratello si chiama $fratello\n";
+}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Assegnamenti nel ciclo}
+\begin{lstlisting}
+my @fratelli=qw(Cino Dino Gino Lino);
+foreach my $fratello (@fratelli) {
+ $fratello="<$fratello>";
+}
+\end{lstlisting}
+
+Questo {\em cambia il valore} degli elementi dell'array \lstinline!@fratelli!.
+\end{frame}
+%$
+
\subsection{Il contesto}
\section{Subroutine}
@@ -498,9 +793,11 @@ Adesso \lstinline!$riga! non contiene più il carattere di ``a capo''
\section{Argomenti avanzati}
+\subsection{Variabile implicita} % $_
+
\subsection{Manipolazione di stringhe} % substr, sprintf
-\subsection{Manipolazione di liste} % sort, grep, map
+\subsection{Manipolazione di liste} % reverse, sort, grep, map
\subsection{Indici multipli} % array & hash slices