Changeset 162 for trunk/perl/syntaxe.tex
- Timestamp:
- 08/22/08 18:58:16 (16 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/perl/syntaxe.tex
r161 r162 1 1 % $Id$ 2 \documentclass[notes]{beamer}3 \usepackage[frenchb]{babel}4 \usepackage[T1]{fontenc}5 \usepackage{moreverb}6 \usepackage{graphicx}7 8 \mode<presentation>9 {10 \definecolor{beamerstructure}{RGB}{143,79,112}11 \definecolor{sidebackground}{RGB}{230,242,250}12 \color{beamerstructure}13 \usetheme{Frankfurt}14 \usepackage{times}15 \userightsidebarcolortemplate{\color{sidebackground}}16 \beamertemplateballitem17 }18 19 \title{Perl}20 \subtitle{5}21 \author{Olivier Thauvin}22 \date{\today}23 24 \AtBeginSection[]25 {26 \begin{frame}<beamer>27 \frametitle{Plan}28 \tableofcontents[currentsection]29 \end{frame}30 }31 32 \AtBeginSubsection[]33 {34 \begin{frame}<beamer>35 \frametitle{Plan}36 \tableofcontents[currentsubsection]37 \end{frame}38 }39 40 \begin{document}41 42 \frame{\titlepage}43 44 \section*{Sommaire}45 46 \begin{frame}{Plan}47 \tableofcontents48 \end{frame}49 50 \section{Presentation}51 52 \begin{frame}53 \frametitle{PERL}54 Perl, écrit par Larry Wall en 1987.55 \vfill56 \emph{Practical Extraction and Report Language}57 (\emph{langage pratique d'extraction et de génération de rapports})58 \vfill59 \emph{Pathetically Eclectic Rubbish Lister}60 (\emph{collectionneur de déchets pathétiquement éclectiques})61 \vfill62 63 Je parle de Perl \textbf{5} !64 65 Dernière version 5.10.0 (Rafael Garcia-Suarez)66 \vfill67 68 Perl est disponible sur UNIX, Windows (et cygwin), OS2, VMS, \ldots69 \end{frame}70 71 \begin{frame}72 \frametitle{Pourquoi PERL ?}73 \begin{itemize}74 \item langage scripté, non compilé75 \pause76 \item portable77 \pause78 \item permet une écriture rapide79 \pause80 \item possède un ramasse miettes (garbage collector)81 \pause82 \item est orienté objet83 \pause84 \item possède un grand nombre de modules additionnels85 \end{itemize}86 \pause87 \vfill88 \vfill89 Utilisation:90 \begin{itemize}91 \item petits scripts type shell92 \pause93 \item des programmes complexes94 \pause95 \item des services de toutes sortes96 \pause97 \item des sites web98 \end{itemize}99 \end{frame}100 101 \begin{frame}[fragile]102 \frametitle{Exemples}103 Exemple de script:104 \vfill105 \begin{verbatim}106 #!env perl107 108 print "Hello World\n";109 \end{verbatim}110 \vfill111 \vfill112 Sinon on peut aussi faire ça:113 \vfill114 \verb+perl -e 'print "Hello World\n"'+115 \end{frame}116 \begin{frame}[fragile]117 \frametitle{bestever.pl}118 Sinon ça peut aussi ressembler à ça:119 \vfill120 \begin{tiny}121 \begin{verbatim}122 /;{}def/#{def}def/$_={/Times-Bold exch selectfont}#/_{rmoveto}#/"{dup}#/*/!/$123 ;/q{exch}#/x ; {/J q #}#/.{/T q #}#{stringwidth}#{}#{}# 14 string dup dup dup124 260 40 moveto 90 rotate ; %/}};$0='"\e[7m \e[0m"';@ARGV=split//,reverse125 q(ThePerl). q(Journal) x 220 ; q ; 0 T putinterval exch 7 J putinterval ;126 ; $_= q /m$ pop T($*!$"=!$ " )pop " * true% ? $ " $!" " !! !! % !" !" !127 ! charpath {!"""}pop $ pop{""!}pop ! neg{!#}pop 220 ! neg _{!!}pop J false %T128 charpath clip " pop 0 " moveto 6{!!}pop $_= 105{!!}pop {$ ! $ " ! #! ##}129 pop{dup dup $ ! " pop pop q{"}pop 22{dup show}repeat {"}pop q 22 mul{$ "} pop130 neg{!#! $ "}pop ! 8 .65 mul{$ # # $}pop ! neg{"}pop _ pop{"}pop } repeat pop131 " { $ " ! ! ! $ " ! !" "#" #"!"""""! #" " # "m/;@ARGV=(@ARGV[-14..-1])x50;q}132 0 "%};s/m[ou]|[-\dA-ln-z.\n_{}]|\$_=//gx;s/(.)(?{$*=''})/('$*.='.(++$#133 %2?'':"$0;").'pop;')x(ord($1)-31).'$*'/gee;s/((.(\e\[.m)*|.){77})/$1\n/g;print134 ; sub showpage {}135 \end{verbatim}136 \end{tiny}137 \vfill138 De Philippe Bruhat (Book).139 \end{frame}140 141 \section{Variables}142 143 \subsection{Variables de Perl}144 145 \begin{frame}146 \frametitle{types de variables}147 \textbf{15} types de variables:148 \vfill149 \pause150 \includegraphics[height=40mm]{Angel_fish}151 \pause152 \includegraphics[height=40mm]{tableau}153 \pause154 \includegraphics[height=40mm]{hache}155 \pause156 \vfill157 Et les autres on s'en moque...158 \end{frame}159 160 \subsection{Scalaire}161 162 \begin{frame}[fragile]163 \frametitle{scalaire}164 Un \textbf{scalaire} est une simple valeur:165 \pause166 \vfill167 \begin{itemize}168 \item \emph{undef}169 \pause170 \item définie:171 \begin{itemize}172 \item un chiffre, nombre173 \item une chaine de caractères174 \item une suite d'octets binaires175 \item \ldots176 \end{itemize}177 \end{itemize}178 \pause179 \vfill180 \begin{verbatim}181 $rien = undef;182 $chiffre = 42;183 $chaine = "1";184 print $chaine + $chiffre;185 print $chaine . $chiffre;186 \end{verbatim}187 \pause188 \vfill189 Valeur \textit{fausses}: \textit{undef}, 0, ""190 191 Valeur \textit{vraies}: le reste: 1, "0", "un chien ?"192 \end{frame}193 194 \subsection{Les tableaux}195 196 \begin{frame}[fragile]197 \frametitle{tableau (array)}198 Les tableaux sont des piles de \textit{scalaires}.199 \pause200 201 Ils sont dynamiques, et a une seule dimension (mais ce n'est pas un problème en fait).202 \pause203 \vfill204 Déclarer le tableau:205 206 \verb+@tableau = ("un", 2);+207 \vfill208 Accéder aux/Déclarer les valeurs d'un tableau (attention au \$):209 210 \begin{verbatim}211 $tableau[3] = 4;212 $tableau[-1]; # dernier élément213 \end{verbatim}214 215 \pause216 \vfill217 Mais en fait:\hfill218 \begin{tabular}{rcl}219 shift <=&\verb+0@@@@@n+&<= push\\220 unshift =>&\verb+0@@@@@n+&=> pop\\221 \end{tabular}222 \pause223 \vfill224 Nombre d'éléments: \verb+scalar(@tableau)+225 226 Dernier indice: \verb+$#tableau+227 \end{frame}228 229 \begin{frame}[fragile]230 \frametitle{hash}231 Ce sont des tableaux indexés \verb+clef => valeur+.232 233 Ils sont dynamiques.234 235 \pause236 \begin{itemize}237 \item la clef est une valeur textuelle simple238 \item la valeur est un \textbf{scalaire}239 \item l'ordre des clefs n'est pas conservé !!!240 \end{itemize}241 242 \pause243 Déclarer un tableau de hashage:244 \begin{verbatim}245 %hash = (246 foo => "un"247 bar => 2248 );249 \end{verbatim}250 251 \pause252 Accéder aux/Déclarer les valeurs d'un hash (attention au \$):253 \begin{verbatim}254 $hash{baz} = 'trois';255 $clef = 'clef';256 $hash{$clef};257 \end{verbatim}258 259 \end{frame}260 261 \subsection{Les listes}262 263 \begin{frame}[fragile]264 \frametitle{Comprendre les listes}265 \textbf{Perl aplati les listes !}266 267 Le concept est simple, mais redoutable:268 \pause269 270 Prenons deux tableaux de trois entrées:271 \begin{verbatim}272 @tab1 = (1, 2, 3);273 @tab2 = (4, 5, 6);274 \end{verbatim}275 \pause276 277 Récupérer la première entrée, et le reste de \verb+@tab1+278 \begin{verbatim}279 ($un, @reste) = @tab1;280 \end{verbatim}281 \pause282 Récupérer la première entrée, et le reste de \verb+@tab1+ et \verb+@tab2+283 \begin{verbatim}284 ($un, @reste) = (@tab1, @tab2);285 \end{verbatim}286 \pause287 Récupérer la deuxième entrée, et le reste de \verb+@tab1+ et \verb+@tab2+288 \begin{verbatim}289 (undef, $deux, @reste) = (@tab1, @tab2);290 \end{verbatim}291 \end{frame}292 293 \begin{frame}[fragile]294 \frametitle{Comprendre les listes: les hash}295 Mais le pire, c'est que ce concept s'applique aussi \textbf{hash}296 \pause297 298 '\verb+=>+' est un séparateur comme la '\verb+,+', donc c'est une liste:299 \begin{verbatim}300 %hash = (un => 1, deux => 2);301 %hash = (un, 1, deux, 2);302 \end{verbatim}303 \pause304 Si un hash revois une liste et prends une liste\ldots305 \begin{verbatim}306 @tab = %hash;307 \end{verbatim}308 \verb+@tab+ contient "un", 1\ldots309 310 \begin{verbatim}311 @tab = (1, 2, 3, 4);312 %hash = @tab;313 %unhash = (%hash2, %hash3);314 \end{verbatim}315 \verb+%hash+ contient 1 \verb+=>+ 2, 3 \verb+=>+ 4\ldots316 317 Les clef dupliquées sont ecrasées, la dernière gagne !318 319 \end{frame}320 2 321 3 \section{Syntaxe} … … 658 340 659 341 660 \section{Variables bis}661 662 \subsection{Références}663 664 \begin{frame}[fragile]665 \frametitle{Référence: Concept}666 C'est une valeur scalaire\ldots667 668 \pause669 \vfill670 qui fait référence à un scalaire, un tableau ou un hash.671 672 \pause673 \vfill674 \begin{itemize}675 \item elle contient l'adresse mémoire de l'élément pointé676 \pause677 \item plusieurs références peuvent pointer la même variable678 \pause679 \item on peut faire des tableaux de références\ldots680 \end{itemize}681 \pause682 \vfill683 \textbf{Ce n'est pas un pointeur au sens C du terme}: \verb.$ref++;. ne donnera rien de bien !!!!684 \end{frame}685 686 \begin{frame}[fragile]687 \frametitle{Créer des références}688 \pause689 Référence de tableaux:690 \pause691 \vfill692 \begin{verbatim}693 my @tableau = (1, 2, 3);694 \end{verbatim}695 \pause696 Récupérer une référence vers:697 \begin{verbatim}698 my $tabref = \@tableau;699 \end{verbatim}700 \pause701 Créer une référence vers un nouveau tableau:702 \begin{verbatim}703 my $tabref = [ @tableau ];704 \end{verbatim}705 \vfill706 \vfill707 \pause708 Référence de hash:709 \pause710 \vfill711 \begin{verbatim}712 my %hash = (a => 1);713 \end{verbatim}714 \pause715 Récupérer une référence vers:716 \begin{verbatim}717 my $hashref = \%hash;718 \end{verbatim}719 \pause720 Créer une référence vers un nouveau tableau:721 \begin{verbatim}722 my $hashref = { %hash } ;723 \end{verbatim}724 \end{frame}725 726 \begin{frame}[fragile]727 \frametitle{Utiliser les références}728 Pour accéder au contenu la variable référencée on utilise \verb+->+.729 \vfill730 Pour acceder à la variable elle même: \verb+$$+, \verb+@$+ et \verb+%$+ pour731 respectivement les scalaires, tableaux et les hash.732 733 \pause734 On créer un réference:735 \begin{verbatim}736 my $tabref = [ 1, 2, 3 ];737 my $hashref = { a => 1 };738 \end{verbatim}739 \pause740 On accède au tableau via la référence:741 \begin{verbatim}742 $tabref->[0];743 $hashref->{a};744 \end{verbatim}745 \pause746 Après tout est presque pareil:747 \begin{verbatim}748 scalar(@$tabref);749 keys %$hashref;750 \end{verbatim}751 752 \end{frame}753 754 \begin{frame}[fragile]755 \frametitle{Pourquoi les références ?}756 Perl aplati les listes, remember ?757 758 \pause759 \begin{verbatim}760 my @tab1 = (1,2); my @tab2 = (3,4);761 my @tab = (@tab1, @tab2);762 \end{verbatim}763 \verb+@tab+ contient 4 éléments...764 \pause765 \begin{verbatim}766 my @tab1 = (1,2); my @tab2 = (3,4);767 my @tab = (\@tab1, \@tab2);768 \end{verbatim}769 \verb+@tab+ contient 2 éléments qui réferencent des tableaux.770 \pause771 772 On accède aux valeurs:773 \begin{verbatim}774 $tab[0]->[0];775 \end{verbatim}776 \pause777 Ou même plus simplement:778 \begin{verbatim}779 $tab[0][0];780 \end{verbatim}781 \ldots qui revient à faire un tableau à 2 dimensions.782 783 \end{frame}784 785 \begin{frame}[fragile]786 \frametitle{Références: copain de la mémoire}787 \begin{small}788 \begin{verbatim}789 # très gros tableau790 my @tab = ();791 792 fonc(@tab);793 794 sub fonc {795 my @tab = @_; # Créer un copie complète796 }797 \end{verbatim}798 \pause799 \begin{verbatim}800 # très gros tableau801 my @tab = ();802 803 fonc(\@tab);804 805 sub fonc {806 my ($tab) = @_; # Ne copie que la référence807 }808 \end{verbatim}809 \end{small}810 \end{frame}811 812 \begin{frame}[fragile]813 \frametitle{Références: les pièges}814 Déférencer un undef:815 \begin{verbatim}816 perl -we 'my $ref; print @{ $ref }'817 Use of uninitialized value $ref in818 array dereference at -e line 1.819 \end{verbatim}820 \pause821 Voici l'astuce:822 \begin{verbatim}823 perl -we 'my $ref; print @{ $ref || [] }'824 \end{verbatim}825 \pause826 \vfill827 \vfill828 Attention au type de variable référencée:829 \begin{verbatim}830 perl -we 'my $ref = {}; print @{ $ref }'831 Not an ARRAY reference at -e line 1.832 \end{verbatim}833 \pause834 \vfill835 \vfill836 Attention au structure complexes:837 \begin{verbatim}838 $ref->[0][2]{daleks}[0]{episode}839 {$ennemi}{histoire}[0];840 \end{verbatim}841 \end{frame}842 843 \begin{frame}[fragile]844 \frametitle{Références: dernières choses}845 On peut connaitre le type de référence avec \verb+ref()+846 \begin{verbatim}847 perl -we 'my $ref = {}; print ref $ref'848 HASH849 \end{verbatim}850 \vfill851 \vfill852 \pause853 Tout est là:\\854 \verb+man perlreref+855 \end{frame}856 857 \subsection{les descripteurs de fichier}858 859 \begin{frame}[fragile]860 \frametitle{Fichiers: Version simple}861 Version moderne:862 863 Ouvrir un fichier en lecture:864 \begin{verbatim}865 open(my $handle, '<', 'fichier');866 \end{verbatim}867 \pause868 Lire une ligne:869 \begin{verbatim}870 my $line = <$handle>;871 chomp($line); # strip cariage return872 \end{verbatim}873 \pause874 Fermer le fichier:875 \begin{verbatim}876 close($handle);877 \end{verbatim}878 \pause879 \vfill880 Ancienne méthode:881 \begin{verbatim}882 open(HANDLE, '<', 'fichier');883 my $line = <HANDLE>;884 chomp($line); # strip cariage return885 close(HANDLE);886 \end{verbatim}887 \end{frame}888 889 \begin{frame}[fragile]890 \frametitle{Fichier: version simple (suite)}891 892 Ouvrir:893 \begin{verbatim}894 open(my $handle, '>', 'fichier');895 \end{verbatim}896 \pause897 Écrire:898 \begin{verbatim}899 print $handle "Exterminate !\n";900 \end{verbatim}901 \begin{textbf}Attention à \verb+print+: pas de \verb+,+ après le file handle\end{textbf}902 903 \pause904 \vfill905 Fermer:906 \begin{verbatim}907 close($handle);908 \end{verbatim}909 \pause910 Trois file handle par défaut: \verb+STDIN+, \verb+STDOUT+, \verb+STDERR+911 (entrée, sortie, sortie d'erreur).912 \end{frame}913 914 \begin{frame}[fragile]915 \frametitle{Fichiers: Version compliquée}916 Pour des besoins très spécifiques:917 \begin{itemize}918 \item open()/close()919 \item read()/print()920 \end{itemize}921 922 \vfill923 ou:924 \vfill925 \pause926 \begin{itemize}927 \item sysopen()/sysclose()928 \item sysread()/syswrite()929 \end{itemize}930 \pause931 \vfill932 \vfill933 Si vraiment vous voulez en savoir plus: \verb+man+934 \begin{itemize}935 \item perlfunc936 \pause937 \item perlopentut938 \end{itemize}939 \end{frame}940 941 \section{Traiter les chaines de caractères}942 943 \subsection{quote}944 945 \begin{frame}[fragile]946 \frametitle{Délimiteurs}947 On peut utiliser les délimiteurs:948 \begin{itemize}949 \item n'importe quel caractères950 \item les couples logiques \verb+()+, \verb+[]+, \verb+{}+951 \end{itemize}952 953 Exemple: \verb+q//+, \verb+q;;+, \verb+q[]+, \verb+q{}+954 955 \pause956 \vfill957 Chaine interpolées:958 959 \begin{verbatim}960 my $var = "UMR7620";961 962 print "nous somme $var";963 pinrt qq{nous somme "$var"};964 \end{verbatim}965 966 \pause967 \vfill968 Chaine non interpolées:969 970 \begin{verbatim}971 my $var = 'UMR7620';972 973 print '$var est une variable';974 print q{'$var' est une variable};975 \end{verbatim}976 \end{frame}977 978 \begin{frame}[fragile]979 \frametitle{quote quote}980 Pour les longues chaines:981 \vfill982 \begin{verbatim}983 my $var = 42;984 985 print <<FIN_DU_TEXTE;986 La réponse à la question987 universelle est $var.988 FIN_DU_TEXTE989 \end{verbatim}990 \vfill991 \end{frame}992 993 \subsection{RegExp}994 995 \begin{frame}996 \frametitle{Perl réinvente les RegExp}997 Les expressions régulières de Perl sont très puissantes !998 999 \vfill1000 \emph{Perl ça pue, y'a pas de fonction pour travailler avec des regexp comme en php}1001 \vfill1002 Php comme d'autres utilise la lib PCRE (Perl Compatible Regular Expressions).1003 1004 \pause1005 \vfill1006 Attention: Perl utilise des expressions régulières très étendues1007 \end{frame}1008 1009 \begin{frame}[fragile]1010 \frametitle{Anatomie}1011 Deux opérateurs:1012 \begin{itemize}1013 \item \verb+=~+ : correspond1014 \item \verb+!~+ : ne correspond pas1015 \end{itemize}1016 \pause1017 1018 L'expression régulière:1019 \pause1020 1021 \begin{semiverbatim}1022 $var =~ \onslide<3->{/}\onslide<4->{motif}\onslide<3->{/};1023 $var =~ \onslide<2->{m}\onslide<3->{/}\onslide<4->{motif}\onslide<3->{/};1024 $var =~ \onslide<2->{s}\onslide<3->{/}\onslide<4->{motif}\onslide<3->{/}\onslide<4->{remplacement}\onslide<3->{/};1025 \end{semiverbatim}1026 1027 \begin{itemize}1028 \item une action1029 \begin{itemize}1030 \item \textbf{m} (match, le défaut)1031 \item \textbf{s} (substitute)1032 \end{itemize}1033 \pause1034 \item des séparateurs (au choix)1035 \pause1036 \item le texte recherché (et le remplacement)1037 \end{itemize}1038 1039 \end{frame}1040 1041 \section*{Fin}1042 1043 \begin{frame}{Questions ?}1044 \center{1045 \hfill1046 }1047 \end{frame}1048 1049 \end{document}
Note: See TracChangeset
for help on using the changeset viewer.