% $Id$
\section{Chaines de caractères}

\subsection{quote}

\begin{frame}[fragile]
\frametitle{Opérateur et délimiteurs}
\begin{block}{}
\begin{tabular}{|l|l|l|}
\hline
\textbf{faire}&\textbf{interpollée}&\textbf{non interpolée}\\
\hline
\hline
une chaine&\verb+""+&\verb+''+\\
\hline
\hline
une chaine&\verb+q//+&\verb+qq//+\\
\hline
une liste&&qw//\\
\hline
\end{tabular}
\end{block}
\vfill
\pause

\begin{block}{Délimiteurs des opérateurs:}
\begin{itemize}
\item n'importe quels caractères
\item les couples logiques \verb+()+, \verb+[]+, \verb+{}+
\end{itemize}
\end{block}
\vfill
\pause
\begin{exampleblock}{}
Exemple: \verb+q//+, \verb+q;;+, \verb+q[]+, \verb+q{}+
\end{exampleblock}
\end{frame}

\begin{frame}[fragile]
\frametitle{quote: exemple}

\pause
\vfill
Chaine interpolées:

\begin{verbatim}
my $var = "UMR7620";

print "nous somme $var";
pinrt qq{nous somme "$var"};
\end{verbatim}

\pause
\vfill
Chaine non interpolées:

\begin{verbatim}
my $var = 'UMR7620';

print '$var est une variable';
print q{'$var' est une variable};
\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{quote quote}
Pour les longues chaines:
\vfill
\begin{verbatim}
my $var = 42;

print <<FIN_DU_TEXTE;
La réponse à la question
universelle est $var.
FIN_DU_TEXTE
\end{verbatim}
\vfill
\end{frame}

\subsection{RegExp}

\begin{frame}
\frametitle{Perl réinvente les RegExp}
Les expressions régulières de Perl sont très puissantes !

\vfill
\emph{Perl ça pue, y'a pas de fonction pour travailler avec des regexp comme en php}
\vfill
Php comme d'autres utilise la lib PCRE (Perl Compatible Regular Expressions).

\pause
\vfill
Attention: Perl utilise des expressions régulières très étendues
\end{frame}

\begin{frame}[fragile]
\frametitle{Anatomie}
Deux opérateurs:
\begin{itemize}
\item \verb+=~+ : correspond
\item \verb+!~+ : ne correspond pas
\end{itemize}
\pause

L'expression régulière:

\begin{semiverbatim}
  $var =~  \onslide<3->{m}\onslide<4->{/}\onslide<5->{motif}\onslide<4->{/}\onslide<6->{g};
  $var =~   \onslide<4->{/}\onslide<5->{motif}\onslide<4->{/}\onslide<6->{g};
  $var =~  \onslide<3->{s}\onslide<4->{/}\onslide<5->{motif}\onslide<4->{/}\onslide<5->{remplacement}\onslide<4->{/}\onslide<6->{g};
\end{semiverbatim}

\vfill
\pause
\begin{itemize}
\item une action
    \begin{itemize}
    \item \textbf{m} (match, le défaut)
    \item \textbf{s} (substitute)
    \end{itemize}
\pause
\item des séparateurs (au choix)
\pause
\item le texte recherché (et le remplacement)
\pause
\item éventuellement un modificateur
\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{RegExp: les bases}
Regarde si un chaine correspond à un motif

Où le motif peut contenir:
\vfill

\begin{tabular}{cl}
\verb+.+&1 caractère\\
\pause
&\\
\verb+*+&0 ou plusieurs fois\\
\verb-+-&1 ou plusieurs fois\\
\verb+?+&1 fois\\
\pause
&\\
\verb+\+&echape un caractère magique\\
\pause
&\\
\verb+^+&début de ligne\\
\verb+$+&fin de ligne\\
\pause
&\\
\verb+()+&forme un groupe\\
\end{tabular}

\vfill

\verb+man perlre+ pour tout savoir\ldots
\end{frame}

\begin{frame}[fragile]
\frametitle{RegExp: exemple dans perl}
\begin{verbatim}
my @list = ('UMR7620', 'umr8639');

foreach my $umr (@list) {
    my ($number) = $umr =~ /^umr(.*)$/;
    if ($number)  {
        print "Unité mixte $number\n";
    }
}
\end{verbatim}
\pause
\vfill
Bon, je parle de perl, pas des RegExp, alors \verb+man perlre+ et \verb+man perlretut+ !

\end{frame}
