From f60c9570f4b2d8dcafe60e319d308d24d2a2822c Mon Sep 17 00:00:00 2001 From: dakkar 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(-) 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