Index: trunk/tp-perl/Makefile
===================================================================
--- trunk/tp-perl/Makefile	(revision 270)
+++ trunk/tp-perl/Makefile	(revision 271)
@@ -14,4 +14,5 @@
    exercice02.pl \
    fichier.pl  filespec.pl  filewhich.pl \
+   services-file.pl  services.pl \
 
 FIGURES= \
Index: trunk/tp-perl/exercice01.pl
===================================================================
--- trunk/tp-perl/exercice01.pl	(revision 270)
+++ trunk/tp-perl/exercice01.pl	(revision 271)
@@ -1,6 +1,4 @@
-#!/bin/env perl
-
+#!/bin/env perl -w
 use strict;
-use warnings;
 
 foreach my $let (qw(a b c)) {
Index: trunk/tp-perl/main.tex
===================================================================
--- trunk/tp-perl/main.tex	(revision 270)
+++ trunk/tp-perl/main.tex	(revision 271)
@@ -52,5 +52,5 @@
 
 \begin{frame}
-\frametitle{RÃšgles de perl}
+\frametitle{Perl}
 \begin{alertblock}{TMTOWTDI}
 There's more than one way to do it
@@ -58,7 +58,8 @@
 \pause
 
-\begin{exampleblock}{Documentations de base}
-\begin{itemize}
-\item perlfunc: fonctions principales
+\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{}
@@ -71,5 +72,5 @@
 \begin{frame}[fragile]
 \frametitle{Perl}
-\begin{block}{Le programme}
+\begin{block}{Le programme perl}
 \begin{verbatim}
 $ perl -v
@@ -84,5 +85,5 @@
 
 \begin{frame}[fragile]
-\frametitle{First Script}
+\frametitle{Premier Script perl}
 \begin{exampleblock}{Hello World!}
 \verbatiminput{hello-world.pl}
@@ -103,5 +104,5 @@
 
 main::(-e:1):   0
-  DB<1> print "coucou"                                                                                                                                       
+  DB<1> print "coucou"
 coucou
   DB<2>
@@ -140,9 +141,9 @@
 
 \begin{frame}[fragile]
-\frametitle{Renvois d'erreur}
+\frametitle{die() et warn()}
 \begin{block}{Fonctions:}
 \begin{itemize}
 \item \verb+warn()+: affiche un message d'erreur
-\item \verb+die()+: met aussi fin au script
+\item \verb+die()+: met de plus fin au script
 \end{itemize}
 \end{block}
@@ -162,5 +163,5 @@
 
 \begin{frame}[fragile]
-\frametitle{Boucles}
+\frametitle{Traitement sur des listes}
 \begin{block}{foreach}
 \verb+foreach my $v (@tab) { }+
@@ -191,4 +192,16 @@
 \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}
@@ -401,4 +414,6 @@
 \section{Utilisation d'un module}
 
+\subsection{Howto}
+
 \begin{frame}
 \frametitle{CPAN}
@@ -440,5 +455,5 @@
 \end{frame}
 
-\section{Parser la ligne de commande}
+\subsection{Parser la ligne de commande}
 
 \begin{frame}
@@ -467,3 +482,37 @@
 \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}
Index: trunk/tp-perl/services-file.pl
===================================================================
--- trunk/tp-perl/services-file.pl	(revision 271)
+++ trunk/tp-perl/services-file.pl	(revision 271)
@@ -0,0 +1,31 @@
+#!/bin/env perl -w
+
+use strict;
+use Getopt::Long;
+
+GetOptions(
+    'n' => \my $bynumber,
+) or die "Wrong options given\n";
+my ($serv, $proto) = @ARGV;
+$proto or die "Usage: $0 [-n] SERVICE PROTOCOL\n";
+
+open(my $handle, '<', '/etc/services')
+    or die "Can't open services file: $!\n";
+
+while (my $line = <$handle>) {
+    chomp($line);
+    $line =~ s/#.*//;
+    my ($mname, $mport, $mproto) = $line =~ m:(\S+)\s+(\d+)/(\w+):
+            or next;
+    if ($bynumber) {
+        if ($mport == $serv && $proto eq $mproto) {
+            print "$mname\n"; exit(0);
+        }
+    } else {
+        if ($mname eq $serv && $proto eq $mproto) {
+            print "$mport\n"; exit(0);
+        }
+    }
+}
+close($handle);
+die "Service $proto/$serv no found\n";
Index: trunk/tp-perl/services.pl
===================================================================
--- trunk/tp-perl/services.pl	(revision 271)
+++ trunk/tp-perl/services.pl	(revision 271)
@@ -0,0 +1,19 @@
+#!/bin/env perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+GetOptions(
+    'n' => \my $bynumber,
+) or die "Wrong options given\n";
+
+my ($serv, $proto) = @ARGV;
+$proto or die "Usage: $0 [-n] SERVICE PROTOCOL\n";
+
+my @service = ($bynumber
+    ? getservbyport($serv, $proto)
+    : getservbyname($serv, $proto))
+    or die "Service $proto/$serv no found\n";
+
+print(($bynumber ? $service[0] : $service[2]), "\n");
