% $Id$ \section{Variables bis} \subsection{Références} \begin{frame}[fragile] \frametitle{Référence: Concept} \begin{block}{Quoi ça ?} C'est une valeur scalaire\ldots \pause \vfill qui fait référence à un scalaire, un tableau ou un hash. \pause \vfill \begin{itemize} \item elle contient l'adresse mémoire de l'élément pointé \pause \item plusieurs références peuvent pointer la même variable \pause \item on peut faire des tableaux de références\ldots \end{itemize} \end{block} \pause \vfill \begin{alertblock}{Ce n'est pas un pointeur au sens C du terme} \verb.$ref++;. ne donnera rien de bien !!!! On fait du perl, on ne joue pas avec les octets de la mémoire. \end{alertblock} \end{frame} \begin{frame}[fragile] \frametitle{Créer des références} \begin{exampleblock}{Renvoyer la référence de} \verb+\+ pour renvoyer un référence: \begin{verbatim} my $ref = \$scalaire; my $ref = \@tableau; my $ref = \%hash; \end{verbatim} \end{exampleblock} \vfill \pause \begin{block}{Créer une référence:} \begin{tabular}{|l|c|} \hline Type de variable&code\\ \hline \hline tableau&\verb+[ 'val1', 'val2' ]+\\ \hline hash&\verb+{ key => val }+\\ \hline \end{tabular} \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Utiliser les références} \begin{exampleblock}{prenons une référence} \begin{verbatim} $ref = { key => 'val' }; print $ref; HASH(0x8bca880) \end{verbatim} \end{exampleblock} \pause \begin{block}{Accès aux variable} \center \begin{tabular}{|l|c|c|} \hline type&variables&éléments de\\ \hline \hline scalaire&\verb+$$var+&\\ \hline tableau&\verb+@{$ref}+&\verb+$ref->[0]+\\ \hline hash&\verb+%{$ref}+&\verb+$ref->{'key'}+\\ \hline \end{tabular} \end{block} \pause \begin{exampleblock}{} \begin{verbatim} foreach my $key (keys %$ref) { print "$ref->{$key}\n"; } \end{verbatim} \end{exampleblock} \end{frame} \begin{frame}[fragile] \frametitle{Pourquoi les références ?} \begin{alertblock}{Perl aplati les listes, remember ?} \pause \begin{verbatim} my @tab1 = (1,2); my @tab2 = (3,4); my @tab = (@tab1, @tab2); \end{verbatim} \verb+@tab+ contient 4 éléments... \end{alertblock} \pause \begin{block}{par contre:} \begin{verbatim} my @tab1 = (1,2); my @tab2 = (3,4); my @tab = (\@tab1, \@tab2); \end{verbatim} \verb+@tab+ contient 2 éléments qui réferencent des tableaux. \end{block} \pause \begin{block}{On accède aux valeurs:} \begin{verbatim} $tab[0]->[0]; $tab[0][0]; \end{verbatim} \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Références: les pièges} \begin{alertblock}{Déférencer un undef:} \begin{verbatim} perl -we 'my $ref; print @{ $ref }' Use of uninitialized value $ref in array dereference at -e line 1. \end{verbatim} \end{alertblock} \pause \vfill \begin{alertblock}{Attention au type de variable référencée:} \begin{verbatim} perl -we 'my $ref = {}; print @{ $ref }' Not an ARRAY reference at -e line 1. \end{verbatim} \end{alertblock} \pause \vfill \begin{alertblock}{Attention au structure complexes:} \begin{verbatim} $ref->[0][2]{daleks}[0]{episode} {$ennemi}{histoire}[0]; \end{verbatim} \end{alertblock} \end{frame} \subsection{les descripteurs de fichier} \begin{frame}[fragile] \frametitle{Fichiers: Version simple} \begin{exampleblock}{Ouvrir un fichier en lecture:} \begin{verbatim} open(my $handle, '<', 'fichier'); \end{verbatim} \end{exampleblock} \pause \begin{exampleblock}{Lire une ligne:} \begin{verbatim} my $line = <$handle>; chomp($line); # strip cariage return \end{verbatim} \end{exampleblock} \pause \begin{exampleblock}{Fermer le fichier:} \begin{verbatim} close($handle); \end{verbatim} \end{exampleblock} \pause \vfill \begin{alertblock}{Ancienne méthode (perl < 5.6)} \begin{verbatim} open(HANDLE, '<', 'fichier'); my $line = ; close(HANDLE); \end{verbatim} \end{alertblock} \end{frame} \begin{frame}[fragile] \frametitle{Fichier: version simple (suite)} \begin{exampleblock}{Ecrire} \begin{verbatim} open(my $handle, '>', 'fichier'); print $handle "Exterminate !\n"; close($handle); \end{verbatim} \end{exampleblock} \pause \begin{alertblock}{Attention à print} pas de \verb+,+ après le file handle \end{alertblock} \pause \vfill \begin{block}{File handle par défaut} \begin{itemize} \item \verb+STDERR+ (sortie d'erreur) \item \verb+STDOUT+ (sortie standard) \item \verb+STDIN+ (entrée standard) \end{itemize} \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Fichiers: Version compliquée} \begin{block}{haut niveau} \begin{itemize} \item open()/close() \item read()/print() \end{itemize} \end{block} \pause \vfill \begin{block}{bas niveau} \begin{itemize} \item sysopen()/sysclose() \item sysread()/syswrite() \end{itemize} \end{block} \pause \vfill \begin{block}{Glob !} Pour info, un filehandle est une variable de type \textbf{GLOB}. \end{block} \pause \vfill \begin{block}{Si vraiment vous voulez en savoir plus: man} \begin{itemize} \item perlfunc \item perlopentut \end{itemize} \end{block} \end{frame}