% $Id: main.tex 256 2010-07-07 06:24:33Z nanardon $
\documentclass[notes]{beamer}
\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{moreverb}
\usepackage{graphicx}
\usepackage{eurosym}

\mode<presentation>
{
  \definecolor{beamerstructure}{RGB}{143,79,112}
  \definecolor{sidebackground}{RGB}{230,242,250}
  \color{beamerstructure}
  \usetheme{Antibes}
  \usepackage{times}
  \userightsidebarcolortemplate{\color{sidebackground}}
  \beamertemplateballitem
}

\title{TP Perl (5)}
\subtitle{}
\author{Olivier Thauvin}
\date{\today}

%%\setcounter{tocdepth}{2}
\AtBeginSection[]
{
\begin{frame}
    \frametitle{Plan - \secname}
    \tableofcontents[currentsection,hideallsubsections]
\end{frame}
}

\AtBeginSubsection[]
{
\begin{frame}
    \frametitle{Plan - \secname}
    \tableofcontents[currentsection,sectionstyle=show/hide,hideothersubsections,subsectionstyle=show/shaded/hide]
\end{frame}
}

\begin{document}

\frame{\titlepage}

\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}

\section{Introduction}

\begin{frame}
\frametitle{Perl}
\begin{alertblock}{TMTOWTDI}
There's more than one way to do it
\end{alertblock}
\pause

\begin{exampleblock}{Documentations principales}
\begin{itemize}
\item perl: la liste des documentations
\item perlfunc: fonctions de bases
\item perlop: les opérateurs
\item perlvar: les variables \og{}magiques \fg{}
\end{itemize}
\end{exampleblock}
\end{frame}

\section{Premiers pas}

\begin{frame}[fragile]
\frametitle{Perl}
\begin{block}{Le programme perl}
\begin{verbatim}
$ perl -v

This is perl 5, version 12,
subversion 2 (v5.12.2) built for
x86_64-linux-thread-multi
\end{verbatim}
\ldots
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Premier Script perl}
\begin{exampleblock}{Hello World!}
\verbatiminput{hello-world.pl}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Test rapide}
\begin{exampleblock}{Avec le deboguer}
\begin{verbatim}
$ perl -de 0

Loading DB routines from perl5db.pl version 1.33
Editor support available.

Enter h or `h h' for help, or `man perldebug'
for more help.

main::(-e:1):   0
  DB<1> print "coucou"
coucou
  DB<2>
\end{verbatim}
\end{exampleblock}
\end{frame}

\subsection{les variables}

\begin{frame}[fragile]
\frametitle{Variables}
\begin{exampleblock}{Variables!}
\scriptsize{\verbatiminput{variable.pl}}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Les variables magiques}
\begin{block}{variables importantes}
\begin{tabular}{|c|l|}
\hline
\verb+$_+&valeur courante\\
\verb+@_+&la \og{}pile \fg{}\\
\verb+@ARGV+&les arguments passé au script\\
\hline
\verb+$a+ et \verb+$b+&variables de \verb+sort+\\
\hline
\verb+$!+&dernière erreur système\\
\verb+$@+&erreur récupérée par \verb+eval()+\\
\hline
\end{tabular}
\end{block}
\end{frame}

\subsection{Renvois d'erreurs}

\begin{frame}[fragile]
\frametitle{die() et warn()}
\begin{block}{Fonctions:}
\begin{itemize}
\item \verb+warn()+: affiche un message d'erreur
\item \verb+die()+: met de plus fin au script
\end{itemize}
\end{block}
\begin{block}{Fin de ligne}
Sans retour chariot, la ligne est affichée:
\begin{scriptsize}
\begin{verbatim}
  DB<16> die "je meurs"                                                                                                                                      
je meurs at (eval 40)[/usr/lib/perl5/5.12.2/
   perl5db.pl:638] line 2.
\end{verbatim}
\end{scriptsize}
\end{block}
\end{frame}

\subsection{Les boucles}

\begin{frame}[fragile]
\frametitle{Traitement sur des listes}
\begin{block}{foreach}
\verb+foreach my $v (@tab) { }+
\end{block}
\begin{block}{for}
\verb-for(my $i = 0; $i < 10; $i++) { }-
\end{block}
\begin{block}{while}
\verb+while ($i > 0) { $i-- }+
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Exercice 1}
\begin{block}{Enoncé}
Afficher les minuscules et majuscules des 3 1ère lettre de l'alphabet
\end{block}
\begin{block}{Fonction utiles}
\begin{itemize}
\item \verb+uc()+, \verb+lc()+
\item \verb+print+,
\end{itemize}
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Exercice 1: Corrigé}
\begin{exampleblock}{Exercice 1}
\scriptsize{\verbatiminput{exercice01.pl}}
\end{exampleblock}

\begin{exampleblock}{Avec un one-liner}
\scriptsize{
\begin{verbatim}
$ perl -e
    'print $_ . " " . uc($_) . "\n" foreach(qw(a b c))'
a A
b B
c C
\end{verbatim}
}
\end{exampleblock}
\end{frame}

\subsection{Les tableaux}

\begin{frame}[fragile]
\frametitle{Base sur les tableaux}
\begin{block}{le tableau}
\begin{itemize}
\item \verb+my @tableau = ();+ affectations
\item \verb+$#tableau+ renvoi l'indice du dernier élément
\item \verb+@tableau+ renvoi le nombre d'éléments
\end{itemize}
\end{block}
\pause

\begin{block}{Fonction sur les tableaux}
\begin{itemize}
\item \verb+ map { $_        } @tableau+ traite
\item \verb+grep { $_        } @tableau+ filtre
\item \verb+sort { $a <=> $b } @tableau+ tri
\end{itemize}
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Exercice 2:}
\begin{block}{enoncé}
Afficher les mots de cet ennoncé par ordre décroissant.
\end{block}

\begin{exampleblock}{Mot clef}
\begin{itemize}
\item opérateurs: \verb+cmp+, \verb+<=>+, \verb+qw+
\end{itemize}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Exercice 2: Corrigé}
\begin{exampleblock}{Exercice 2}
\scriptsize{\verbatiminput{exercice02.pl}}
\end{exampleblock}
\end{frame}

\subsection{Les HASH}

\begin{frame}[fragile]
\frametitle{Fonctions clefs des HASH}
\begin{block}{Fonctions}
\begin{itemize}
\item \verb+keys+, revois les clefs
\item \verb+values+, renvois les valeurs
\item \verb+exists+ renvois vrai si une clef existe
\item \verb+each+ renvois les couples clef/valeur
\end{itemize}
\end{block}
\end{frame}

\section{Expression régulière}

\begin{frame}[fragile]
\frametitle{RegExp}
\begin{block}{}
Recherche (et remplacement) de motifs.
\end{block}

\begin{block}{Caractères speciaux}
\begin{tabular}{|c|l|}
\hline
\verb+.+&n'importe quel caractère\\
\hline
\verb+?+&répété une fois\\
\verb+*+&répété 0-n fois\\
\verb-+-&répété 1-n fois\\
\hline
\verb-^-&debut de ligne\\
\verb-$-&fin de ligne\\
\hline
\end{tabular}
\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{Opérateur}
\begin{block}{Pas de fonctions, des opérateurs:}
\begin{itemize}
\item \verb+=~+
\item \verb+!~+ (négation)
\end{itemize}
\end{block}
\pause

\begin{exampleblock}{exemple de regexp}
\begin{verbatim}
($match) = $text =~ m/(t.t.)/;
\end{verbatim}
\end{exampleblock} 
\end{frame}

\begin{frame}[fragile]
\frametitle{RegExp Perl:}
\begin{alertblock}{RegExp de perl !}
Certaines fonctionnalités ne sont disponibles que dans PERL
\end{alertblock}
\pause
\begin{exampleblock}{Documentation}
\begin{itemize}
\item \verb+perlre+
\item \verb+perlretut+
\end{itemize}
\end{exampleblock}
\end{frame}

\begin{frame}
\frametitle{RegExp: Exercice}
\begin{block}{Phrase:}
L'attaque sur Pearl Harbor fut
lancée par surprise le matin du dimanche 7 décembre 1941.
\end{block}

\begin{block}{Questions}
\begin{itemize}
\item trouver le premier \og{}mot \fg{}
\item trouver le premier chiffre
\item remplacer \og{}Pearl \fg{} par \og{}Perl \fg{}
\item remplacer les espaces par des \og{}\_ \fg{}
\end{itemize}
\end{block}
\end{frame}

\begin{frame}[fragile]
\begin{block}{Trouver le premier \og{}mot \fg{}}
\begin{verbatim}
$text =~ /([\w']+)/";
print $1;
\end{verbatim}
\end{block}
\pause

\begin{block}{trouver le premier chiffre}
\begin{verbatim}
$text =~ /(\d)/";
print $1;
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}[fragile]
\begin{block}{remplacer \og{}Pearl \fg{} par \og{}Perl \fg{}}
\begin{verbatim}
$text =~ s/Pearl/Perl/;
print $text;
\end{verbatim}
\end{block}
\pause

\begin{block}{remplacer les espaces par des \og{}\_ \fg{}}
\begin{verbatim}
$text =~ s/\s/_/g;
print $text;

L\'attaque_sur_Pearl_Harbor_fut_lancee_par
_surprise_le_matin_du_dimanche_7_décembre
_1941.
\end{verbatim}
\end{block}
\end{frame}

\section{Accès aux fichiers}

\begin{frame}[fragile]
\frametitle{begin()/close()}
\begin{block}{open}
\verb+$ret = open($handle, '>', 'fichier');+
\end{block}
\pause
\begin{alertblock}{3 arguments}
Sur un fichier standard, toujours utiliser open avec 3 arguments.
\end{alertblock}
\pause
\begin{block}{close}
\verb+close($handle);+
\end{block}
\end{frame}


\begin{frame}[fragile]
\frametitle{Lecture}
\begin{block}{binaires:}
\verb+$lus = read($handle, $data, 1024);+
\end{block}

\begin{block}{textes}
\begin{verbatim}
$ligne = <$handle>;
chomp($ligne);
\end{verbatim}
\end{block}
\end{frame}

\begin{frame}
\frametitle{Lire un fichier}
\begin{exampleblock}{}
\scriptsize{\verbatiminput{fichier.pl}}
\end{exampleblock}
\end{frame}

\section{Utilisation d'un module}

\subsection{Howto}

\begin{frame}
\frametitle{CPAN}
\begin{block}{CPAN ?}
Comprehensive Perl Archive Network
\begin{itemize}
\item \href{http://search.cpan.org}{http://search.cpan.org}
\item dépot de modules perl
\item contributions bénévoles
\end{itemize}
\end{block}
\pause
\begin{alertblock}{Regardez sur le CPAN}
Ne réinventez pas la roue !
\end{alertblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Utilisation d'un module}
\begin{block}{use: syntaxe}
\verb+use MODULE @IMPORT;+
\end{block}
\pause
\begin{exampleblock}{File::Spec}
\scriptsize{\verbatiminput{filespec.pl}}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Exercice: which}
\begin{block}{which ?}
Ecrire un script qui affiche l'emplacement d'un executable.
Le module \verb+File::Which+ peut servir !
\end{block}
\pause
\begin{exampleblock}{Solution}
\scriptsize{\verbatiminput{filewhich.pl}}
\end{exampleblock}
\end{frame}

\subsection{Parser la ligne de commande}

\begin{frame}
\frametitle{Getopt::Std}
\begin{exampleblock}{Exemple}
\scriptsize{\verbatiminput{getoptstd.pl}}
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{Getopt::Long}
\begin{block}{Exercice}
Refaire la même chose avec Getopt::Long:
\begin{itemize}
\item l'argument de \verb+-p+ est affiché
\item \verb+-t+ ne fais rien
\end{itemize}
\end{block}
\end{frame}

\begin{frame}[frame]
\frametitle{Getopt::Long}
\begin{exampleblock}{Exemple}
\scriptsize{\verbatiminput{getoptlong.pl}}
\end{exampleblock}
\end{frame}

\section{Exercice final}

\begin{frame}[fragile]
\frametitle{Problème}
\begin{block}{Enoncé:}
Ecrire un programme qui affiche le numéro de port dédié à un couple
service/protocole. Un switch permettra de trouver le service à partir du numéro
de port.
\end{block}

\begin{block}{Informations:}
Ces informations sont stockées dans le fichier \verb+/etc/services+:
\begin{verbatim}
ssh  22/tcp  # SSH Remote Login Protocol
\end{verbatim}
\begin{itemize}
\item Format: \verb+NOM PORT/PROTOCOL+
\item tout ce qui suit un \verb+#+ est du commentaire
\end{itemize}
\end{block}
\end{frame}

\begin{frame}
\frametitle{Solution 1: utilisez les fonctions std}
\begin{exampleblock}{}
\scriptsize{\verbatiminput{services.pl}}
\end{exampleblock}
\end{frame}

\begin{frame}
\frametitle{Solution 2: Parser le fichier}
\tiny{\verbatiminput{services-file.pl}}
\end{frame}

\end{document}
