From f60c9570f4b2d8dcafe60e319d308d24d2a2822c Mon Sep 17 00:00:00 2001
From: dakkar <dakkar@luxion>
Date: Tue, 19 Aug 2008 10:44:44 +0000
Subject: manca solo la parte sui processi...

git-svn-id: svn://luxion/repos/intro-perl@361 fcb26f47-9200-0410-b104-b98ab5b095f3
---
 corso.content.tex | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 216 insertions(+), 2 deletions(-)

(limited to 'corso.content.tex')

diff --git a/corso.content.tex b/corso.content.tex
index d5a6839..e9f870e 100644
--- a/corso.content.tex
+++ b/corso.content.tex
@@ -1581,6 +1581,19 @@ LINEA: while (my $linea=<>) {
 \end{itemize}
 \end{frame}
 
+\begin{frame}[fragile]\frametitle{Qualche modulo utilissimo}
+\begin{itemize}
+\item \lstinline!DBI! per accedere ai database
+\item \lstinline!CGI! per scrivere CGI
+\item \lstinline!LWP! per accedere al web
+\item \lstinline!HTML::Parser! per manipolare HTML
+\item \lstinline!XML::LibXML! per manipolare XML
+\item \lstinline!Template! per generare testo da modelli e dati
+\item \lstinline!Getopt::Long! per le opzioni a riga di comando
+\item \lstinline!DateTime! per manipolare date
+\end{itemize}
+\end{frame}
+
 \begin{frame}\frametitle{Come si scrive un modulo?}
 Non ve lo dico.
 
@@ -1933,16 +1946,217 @@ while (my $file = $dir->next) { ... }
 
 \section{Argomenti avanzati}
 
-\subsection{Variabile implicita} % $_, @_ e @ARGV
+\begin{frame}\frametitle{Cose non di base}
+\begin{itemize}
+\item non sono proprio ``avanzate''
+\item ma nemmeno troppo basilari
+\item servono soprattutto per capire il codice ``idiomatico''
+\end{itemize}
+\end{frame}
+
+\subsection{Variabili speciali} % $_, @_ e @ARGV
+
+\begin{frame}[fragile]\frametitle{Variabile implicita}
+\begin{overprint}
+\onslide<1|handout:1>
+\begin{lstlisting}
+print for @lista;
+\end{lstlisting}
+\onslide<2|handout:0>
+\begin{lstlisting}
+for (@lista) {
+  print;
+}
+\end{lstlisting}
+\onslide<3|handout:0>
+\begin{lstlisting}
+for $_ (@lista) {
+  print $_;
+}
+\end{lstlisting}
+\onslide<4|handout:0>
+\begin{lstlisting}
+for my $elem (@lista) {
+  print $elem;
+}
+\end{lstlisting}
+\end{overprint}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Variabile implicita (2)}
+\lstinline!$_! è una variabile che viene usata implicitamente da molti costrutti e funzioni.
+
+\begin{lstlisting}
+while (<>) {
+ chomp;
+ next if /^\s*#/;
+ my @fields=split;
+}
+\end{lstlisting}
+
+Leggete \texttt{perlvar} per i dettagli. %$
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Altre variabili speciali}
+\rowcolors[]{1}{blue!20}{blue!10}
+\begin{tabular}{l|l}
+\lstinline!@_! & argomenti della sub \\
+\lstinline!@ARGV! & argomenti al programma \\
+\lstinline!$1!\ldots & catture dell'ultimo match \\
+\lstinline!%ENV! & variabili di ambiente \\
+\lstinline!$.! & numero di riga in input \\
+\lstinline/$!/ & errore di sistema
+\end{tabular}
+
+\ \\
+
+Leggete \texttt{perlvar} per le altre.
+\end{frame}
+%$
 
 \subsection{Manipolazione di stringhe} % substr, sprintf
 
-\subsection{Manipolazione di liste} % reverse, sort, grep, map
+\begin{frame}[fragile]\frametitle{\texttt{substr}}
+\begin{lstlisting}
+my $stringa='abcdefghi';
+print substr($a,3,2),"\n";
+substr($a,6,3)='GHIJK';
+print "$a\n";
+\end{lstlisting}
+
+\visible<2->{
+\lstinline!de!
+
+\lstinline!abcdefGHIJK!
+}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{printf} e \texttt{sprintf}}
+\begin{lstlisting}
+printf "%03d - %10s\n",12,'testo';
+my $a=sprintf "%03d - %10s\n",12,'testo';
+\end{lstlisting}
+%$
+
+Come in C.
+\end{frame}
+
+\subsection{Manipolazione di liste} % sort, grep, map
+
+\begin{frame}[fragile]\frametitle{\texttt{sort}}
+\begin{lstlisting}
+my @lista=qw(u y i d f g h c u e a);
+my @lista_ordinata=sort @lista;
+\end{lstlisting}
+
+\lstinline!sort! restituisce una lista ordinata. Normalmente l'ordinamento è lessicografico tra stringhe.
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{sort} (2)}
+\begin{lstlisting}
+my @lista=(2,7,6,8,6,5,9);
+my @lista_ordinata=sort { $a <=> $b } @lista;
+\end{lstlisting}
+
+\lstinline!sort! prende un blocco con la funzione di confronto. \lstinline!<=>! confronta numeri, \lstinline!cmp! confronta stringhe. Il confronto può essere arbitrariamente complesso.
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{grep}}
+\begin{lstlisting}
+my @parole_maiuscole=
+  grep /^\p{Lu}/ @parole;
+my @parolne_lunghe=
+  grep { length($_) > 5 } @parole;
+\end{lstlisting}
+%$
+
+\lstinline!grep! restitusce gli elementi di una lista che soddisfano un certo criterio. Il criterio può essere un'espressione o un blocco. L'elemento da testare si trova in \lstinline!$_! %$
+
+\begin{lstlisting}
+# my @out=grep {test($_)} @in;
+my @out;
+for my $elem (@in) {
+ if (test($elem)) {
+  push @out,$elem;
+ }
+}
+\end{lstlisting}
+
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{\texttt{map}}
+\begin{lstlisting}
+my @maiuscole=map {uc($_)} @minuscole;
+\end{lstlisting}
+%$
+
+\lstinline!map! restituisce la lista dei risultati di un blocco, applicato a ciascun elemento di una lista.
+
+\begin{lstlisting}
+# my @out=map {trans($_)} @in;
+my @out;
+for my $elem (@in) {
+ push @out,trans($elem);
+}
+\end{lstlisting}
+\end{frame}
+%$
 
 \subsection{Indici multipli} % array & hash slices
 
+\begin{frame}[fragile]\frametitle{Array slice}
+\begin{lstlisting}
+my @tutti=('a'..'z');
+my @alcuni=@tutti[1,3,5,7];
+@tutti[1,3,5,7]=('A'..'D');
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Hash slice}
+\begin{lstlisting}
+my %tutti;
+@tutti{'a'..'z'}=0..25;
+my @alcuni_val=@tutti{qw(x y z)};
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]\frametitle{Hash come insiemi}
+\begin{lstlisting}
+my %insieme;
+@insieme{@elementi}=();
+if (exists $insieme{gino}) { ... }
+\end{lstlisting}
+%$
+
+L'assegnamento di lista vuota imposta tutti i valori a \lstinline!undef!: è il modo che occupa meno memoria.
+\end{frame}
+
 \subsection{Operatori logici} % short-circuiting, do or die
 
+\begin{frame}[fragile]\frametitle{Short-circuit}
+\begin{lstlisting}
+open my $fh,'<',$nome
+ or die "Errore: $!";
+\end{lstlisting}
+%$
+
+\begin{itemize}
+\item gli operatori logici (\lstinline!and!, \lstinline!or!, \lstinline!&&!, \lstinline!||!) eseguono solo il minimo necessario
+\item \lstinline!and! e \lstinline!&&!:
+ \begin{itemize}
+ \item valuta la parte sinistra
+ \item se il valore è {\em falso} lo restituisce
+ \item altrimenti restituisce il valore della parte destra
+ \end{itemize}
+\item \lstinline!or! e \lstinline!||!:
+ \begin{itemize}
+ \item valuta la parte sinistra
+ \item se il valore è {\em vero} lo restituisce
+ \item altrimenti restituisce il valore della parte destra
+ \end{itemize}
+\end{itemize}
+\end{frame}
+
 \end{document}
 
 % - 
-- 
cgit v1.2.3

