all:bibles:langages:perl
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| all:bibles:langages:perl [2025/04/29 13:52] – [Concaténation de 2 fichiers] omeylhoc | all:bibles:langages:perl [2025/11/21 10:51] (Version actuelle) – [Fichiers textes] omeylhoc | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ====== Perl ====== | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Général ===== | ||
| + | |||
| + | ==== Aide & documentation ==== | ||
| + | |||
| + | <code bash> | ||
| + | perldoc –f < | ||
| + | man perlfunc # Liste des fonctions disponibles | ||
| + | man CGI # Liste les fonctions du module CGI | ||
| + | man perl # Liste les aides disponibles | ||
| + | </ | ||
| + | |||
| + | ==== Pragma ==== | ||
| + | |||
| + | Il s'agit de directives pour le compilateur que l'on active par le mot clef **use** et que l'on désactive par le mot clef **no**. | ||
| + | |||
| + | <code perl> | ||
| + | use strict ; # Impose la déclaration des variables. | ||
| + | # De plus rend la portée de la variable locale au bloc où elle est déclarée (entre { et }). | ||
| + | no strict ; # Déclaration facultative. | ||
| + | use integer ; # Division entière : 10/3 = 3 | ||
| + | no integer ; # Division normale : 10/3 = 3.3333 | ||
| + | </ | ||
| + | |||
| + | ==== Gestion d' | ||
| + | |||
| + | <code perl> | ||
| + | open (…) or die (" | ||
| + | open (…) or die ("$ ! "); # en cas d’erreur affiche le n°. En l’absence de \n affiche aussi le numéro de la ligne courante. | ||
| + | warn(" | ||
| + | </ | ||
| + | |||
| + | ==== Options ==== | ||
| + | |||
| + | | -e | permet d' | ||
| + | | -w | active les messages de warning | ||
| + | | -d | exécution en mode debug | | ||
| + | | -n | boucle while sur la commande | ||
| + | | -p | comme -n mais affiche les lignes en plus (print) | ||
| + | | -l | active le process de fin de ligne | | ||
| + | |||
| + | === Utilisation en ligne de commande === | ||
| + | |||
| + | Pour balayer l' | ||
| + | |||
| + | <code perl> | ||
| + | cat < | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Variables ===== | ||
| + | |||
| + | ==== Déclaration ==== | ||
| + | |||
| + | === my === | ||
| + | |||
| + | <code perl> | ||
| + | my $var; # déclaration pour un bloc de code | ||
| + | our $var; # déclaration globale | ||
| + | local $var; # déclaration pour un bloc de code ainsi que les sous routines appelées à partir de ce bloc de code | ||
| + | state $var; # la variable n'est initialisé qu'une seule fois | ||
| + | </ | ||
| + | |||
| + | === local === | ||
| + | |||
| + | <code perl> | ||
| + | our $global_var = 42; # Variable globale | ||
| + | |||
| + | sub exemple_local { | ||
| + | local $global_var = 10; # Modifie temporairement $global_var | ||
| + | print "Dans local: $global_var\n"; | ||
| + | sous_fonction(); | ||
| + | } | ||
| + | |||
| + | sub sous_fonction { | ||
| + | print "Dans sous_fonction: | ||
| + | } | ||
| + | |||
| + | exemple_local(); | ||
| + | print " | ||
| + | </ | ||
| + | |||
| + | === state === | ||
| + | |||
| + | <code perl> | ||
| + | use feature ' | ||
| + | |||
| + | sub compteur { | ||
| + | state $count = 0; # $count est initialisé une seule fois | ||
| + | $count++; | ||
| + | return $count; | ||
| + | } | ||
| + | |||
| + | print compteur(); | ||
| + | print compteur(); | ||
| + | print compteur(); | ||
| + | </ | ||
| + | |||
| + | <code perl> | ||
| + | defined | ||
| + | undef # pour désinitialiser une variable. | ||
| + | </ | ||
| + | ==== boolean ==== | ||
| + | |||
| + | Il n' | ||
| + | |||
| + | ==== Scalaire : $calaire ==== | ||
| + | |||
| + | === Base === | ||
| + | |||
| + | | 10 | décimal | ||
| + | | <color # | ||
| + | | <color # | ||
| + | |||
| + | === Exemples === | ||
| + | |||
| + | <code perl> | ||
| + | $var=" | ||
| + | $var=" | ||
| + | $var=" | ||
| + | </ | ||
| + | |||
| + | ==== Tableau : @rray ==== | ||
| + | |||
| + | Un tableau est un ensemble ordonné de valeurs. Les indices du tableau vont de 0 à $#tab (indice du dernier élément). | ||
| + | |||
| + | @var=(4," | ||
| + | | ||
| + | === Affectation scalaire/ | ||
| + | |||
| + | <code perl> | ||
| + | $v1=(4, " | ||
| + | ($v1)=(4, " | ||
| + | ($v1, | ||
| + | $nb=@var; | ||
| + | ($var, | ||
| + | @tab=(@tab1, | ||
| + | (@tab, | ||
| + | @liste=qw/a b c d/; # qw=quoted word, équivalent à @liste=(" | ||
| + | </ | ||
| + | |||
| + | === Accès direct aux éléments === | ||
| + | |||
| + | <code perl> | ||
| + | $tab[0] # premier élément | ||
| + | $tab[$# | ||
| + | @var=@tab[10..15] # | ||
| + | @var=@tab[10, | ||
| + | (fonction())[…] # | ||
| + | </ | ||
| + | |||
| + | === parcourir tableau === | ||
| + | |||
| + | <code perl> | ||
| + | for my $element (@tableau) { print " | ||
| + | for (my $i=0; $i <= $#tableau ; $i++) { print " | ||
| + | </ | ||
| + | |||
| + | === Fonctions sur les tableaux === | ||
| + | |||
| + | <code perl> | ||
| + | shift $var=shift(@tab); | ||
| + | unshift unshift(@tab, | ||
| + | pop pop(@tab); | ||
| + | push push(@tab, | ||
| + | reverse @tab=reverse(@tab); | ||
| + | sort @tab=sort(@tab); | ||
| + | @tab=sort{$a cmp $b}@tab # tri ASCII croissant | ||
| + | @tab=sort{$b cmp $a}@tab # tri ASCII décroissant | ||
| + | @tab=sort{$a <=> $b}@tab # tri numérique croissant | ||
| + | @tab=sort{$b <=> $b}@tab # tri numérique décroissant | ||
| + | split @tab=split(/:/, | ||
| + | @tab=split(/;/, | ||
| + | @tab=split(/,/, | ||
| + | join $var=join(‘-‘, | ||
| + | splice splice(@tab, | ||
| + | grep @tab=grep(/ | ||
| + | if (" | ||
| + | if (@tab) | ||
| + | </ | ||
| + | |||
| + | === Tableau à 2 dimensions === | ||
| + | |||
| + | <code perl> | ||
| + | $Array[0][0] = "0 0"; | ||
| + | $Array[0][1] = "0 1"; | ||
| + | $Array[0][2] = "0 2"; | ||
| + | $Array[0][3] = "0 3"; | ||
| + | $Array[1][0] = "1 0"; | ||
| + | $Array[1][1] = "1 1"; | ||
| + | $Array[1][2] = "1 2"; | ||
| + | |||
| + | print " | ||
| + | print scalar @{$Array[0]}." | ||
| + | |||
| + | push(@{$Array[3]}," | ||
| + | </ | ||
| + | |||
| + | ==== Table de hachage ==== | ||
| + | |||
| + | === Affectation === | ||
| + | |||
| + | <code perl> | ||
| + | %table=(‘monday’, | ||
| + | %table=(monday => ‘lundi’, | ||
| + | </ | ||
| + | |||
| + | === Accès === | ||
| + | |||
| + | <code perl> | ||
| + | $table{$cle}=$valeur; | ||
| + | </ | ||
| + | |||
| + | === Fonctions === | ||
| + | |||
| + | <code perl> | ||
| + | keys(%tab) # | ||
| + | values(%tab) # | ||
| + | each(%tab) # | ||
| + | delete $table{$cle}; | ||
| + | exists $table{$cle} # | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Parcourir une table === | ||
| + | |||
| + | <code perl> | ||
| + | @cle=keys %table; | ||
| + | @valeur=values %table; | ||
| + | for $cle (keys (%table)) { traitement } # retourne les clefs dans un ordre aléatoire | ||
| + | for $cle (sort keys (%table)) { traitement } # retourne les clefs trié en ordre alphabétique | ||
| + | for $valeur (values (%table)) { traitement } # retourne les valeurs dans un ordre aléatoire | ||
| + | @cle=sort {$table{$a} <=> $table{$b}} keys(%table); | ||
| + | </ | ||
| + | |||
| + | === Nombre d' | ||
| + | |||
| + | On obtient le résultat en comptant les clefs : | ||
| + | |||
| + | <code perl> | ||
| + | $nombre = keys (%table); | ||
| + | </ | ||
| + | |||
| + | === hash de hash === | ||
| + | |||
| + | <code perl> | ||
| + | my %hash; | ||
| + | |||
| + | $hash{" | ||
| + | |||
| + | for my $cle1 (sort keys %hash) { | ||
| + | print "$cle1 : \n"; | ||
| + | for my $cle2 (sort keys %{$hash{$cle1}}) { | ||
| + | print " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Variables prédéfinies ==== | ||
| + | |||
| + | | $PROGRAM_NAME | ||
| + | | @ARGV | | Contient les arguments de la ligne de commande | ||
| + | | $PID | $$ | n° de processus exécutant le script | ||
| + | | $OSNAME | ||
| + | | $BASETIM | ||
| + | | $EXECUTABLE_NAME | ||
| + | | $UID | $< | uid réel du processus | ||
| + | | $EUID | $> | uid effectif du processus | ||
| + | | $GID | $( | gid réel du processus (liste des groupes séparés par des espaces) | ||
| + | | $EGID | $) | gid effectif du processus | ||
| + | | $RS | $/ | séparateur d' | ||
| + | | $OFS | $, | séparateur de champs pour l' | ||
| + | | $ORS | $\ | séparateur d' | ||
| + | | $NR | $. | numéro de ligne courante du dernier fichier lu | | ||
| + | | | $[ | Index du premier élément d'un tableau et du premier caractère dans une sous-chaîne de caractères. Par défaut 0 mais peut être positionné à 1 | | ||
| + | | $PERL_VERSION | ||
| + | | $BASETIME | ||
| + | | $ARGV | | Contient le nom du fichier courant quand on lit depuis <> | ||
| + | | @ARGV | | Contient les arguments de la ligne de commande du script | ||
| + | | @INC | | Contient la liste des répertoires où chercher pour les directives **require** et **use** | ||
| + | | %INC | | Contient une entrée pour chacun des fichiers inclus par **require**. La clef est le nom du fichier et la valeur contient la localisation | ||
| + | | %ENV, $ENV{expr} | ||
| + | | %SIG, $SIG{INT} | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | === Parcourir les variables d' | ||
| + | |||
| + | <code perl> | ||
| + | while (($cle, | ||
| + | print “$cle=$valeur\n”; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === Tester si on est root === | ||
| + | |||
| + | <code perl> | ||
| + | if ($<) { | ||
| + | print "on n'est pas root"; | ||
| + | } else { | ||
| + | print "on est root\n"; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === lire un fichier d'un bloc === | ||
| + | |||
| + | <code perl> | ||
| + | { | ||
| + | local $/; # on défini la variable $/ à undef | ||
| + | my $contenu = < | ||
| + | } | ||
| + | # $/ revient à la valeur par défaut \n | ||
| + | </ | ||
| + | |||
| + | ==== Opérateurs ==== | ||
| + | |||
| + | === Mathématiques === | ||
| + | |||
| + | | Multiplication | ||
| + | | Division | ||
| + | | Addition | ||
| + | | Soustraction | ||
| + | | Modulo (reste) | ||
| + | | Incrémentation (pré & post) | ++ | | ||
| + | | décrémentation (pré & post) | - - | | ||
| + | |||
| + | === Logiques booléens === | ||
| + | |||
| + | | Négation logique | ||
| + | | OU | < | ||
| + | | ::: | or | évaluation booléenne incomplète (plus rapide sans exécuter la partie droite si la gauche est déjà vraie) | ||
| + | | ::: | xor | ou exclusif | ||
| + | | ET | && | ||
| + | |||
| + | === Logiques bit à bit === | ||
| + | |||
| + | | Négation bit à bit | ~ | Egalement appelé complément à 1 | | ||
| + | | ET bit à bit | & | Retourne 1 si les deux bits de même poids sont à 1 | | ||
| + | | OU bit à bit | < | ||
| + | | OU exclusif bit à bit | < | ||
| + | | Rotation à gauche | ||
| + | | Rotation à droite avec conservation du signe | < | ||
| + | | Rotation à gauche avec remplissage de 0 | < | ||
| + | |||
| + | === Comparaison numérique === | ||
| + | |||
| + | | Inférieur | ||
| + | | Supérieur | ||
| + | | Inférieur ou égal | %%< | ||
| + | | Supérieur ou égal | %%> | ||
| + | | Egalité | ||
| + | | Différent | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | === Comparaison alphabétique=== | ||
| + | |||
| + | | Inférieur | ||
| + | | Supérieur | ||
| + | | Inférieur ou égal | le | | ||
| + | | Supérieur ou égal | ge | | ||
| + | | Egalité | ||
| + | | Différent | ||
| + | |||
| + | === Divers=== | ||
| + | |||
| + | | Répétition | ||
| + | | Concaténation | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Structures complexes ===== | ||
| + | |||
| + | ==== Références ==== | ||
| + | |||
| + | === opérateur \ === | ||
| + | |||
| + | Les références peuvent être créées en utilisant l' | ||
| + | |||
| + | <code perl> | ||
| + | $refscalaire = \$scalaire; | ||
| + | $reftableau | ||
| + | $rehashage | ||
| + | $reffonction = \& | ||
| + | </ | ||
| + | |||
| + | === opérateur [ ] === | ||
| + | |||
| + | Il est possible de créer une référence sur un tableau anonyme | ||
| + | |||
| + | <code perl> | ||
| + | $reftableau = [1, | ||
| + | </ | ||
| + | |||
| + | === opérateur => === | ||
| + | |||
| + | Il est possible de créer une référence sur une table de hashage anonyme | ||
| + | |||
| + | <code perl> | ||
| + | $refhash = { ' | ||
| + | </ | ||
| + | |||
| + | === opérateur * === | ||
| + | |||
| + | Opérateur de référencement historique du C. | ||
| + | ==== Déréférencement ==== | ||
| + | |||
| + | === Opérateur { } === | ||
| + | |||
| + | <code perl> | ||
| + | print ${$refscalaire}; | ||
| + | print @{$reftableau}; | ||
| + | for my $key (%($refhashage) { }; # peut s' | ||
| + | & | ||
| + | </ | ||
| + | |||
| + | === opérateur -> === | ||
| + | |||
| + | <code perl> | ||
| + | print $reftableau-> | ||
| + | print $refhashage-> | ||
| + | </ | ||
| + | |||
| + | ==== Références symboliques ==== | ||
| + | |||
| + | Lorsqu' | ||
| + | |||
| + | <code perl> | ||
| + | $name = " | ||
| + | $$name | ||
| + | ${$name} | ||
| + | ${$name x 2} = 3; # affecte $variablevariable | ||
| + | $name-> | ||
| + | @$name | ||
| + | & | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Fonctions ===== | ||
| + | |||
| + | ==== Fonctions mathématiques ==== | ||
| + | |||
| + | <code perl> | ||
| + | abs(x) | ||
| + | cos(x) | ||
| + | exp(x) | ||
| + | int(x) | ||
| + | log(x) | ||
| + | sin(x) | ||
| + | sqrt(x) | ||
| + | rand # entier pseudo aléatoire | ||
| + | srand | ||
| + | atan2(x,y) # arc tangente de y/x | ||
| + | </ | ||
| + | |||
| + | === Arrondi à la nième décimale === | ||
| + | |||
| + | <code perl> | ||
| + | my $arrondi=int($valeur * 10 ** $n + 0.5) / 10 ** $n; | ||
| + | </ | ||
| + | |||
| + | ==== Fonctions manipulation de chaînes de caractères ==== | ||
| + | |||
| + | <code perl> | ||
| + | chop(chaine); | ||
| + | chomp(chaine); | ||
| + | $ligne=~s/ | ||
| + | index(chaine, | ||
| + | rindex(chaine, | ||
| + | index(chaine, | ||
| + | length(chaine); | ||
| + | lc(chaine); | ||
| + | lcfirst(chaine); | ||
| + | split(sep, | ||
| + | substr(chaine, | ||
| + | uc(chaine); | ||
| + | ucfirst(chaine); | ||
| + | chr(code); | ||
| + | ord(' | ||
| + | $toto=~s/ | ||
| + | $toto=quotemeta(chaine); | ||
| + | $toto=sprintf(" | ||
| + | </ | ||
| + | |||
| + | === printf === | ||
| + | |||
| + | <code perl> | ||
| + | printf "fmt1 fmt2 ... fmtx", | ||
| + | </ | ||
| + | |||
| + | Même convention que la fonction printf du langage C. | ||
| + | |||
| + | ^ Format | ||
| + | | %% | Caractère % | | ||
| + | | %c | Un caractère dont on fournit le code | | ||
| + | | %s | Une chaîne | ||
| + | | %d | Un entier signé, en décimal | ||
| + | | %u | Un entier non signé, en décimal | ||
| + | | %o | Un entier non signé, en octal | | ||
| + | | %x | Un entier non signé, en hexadécimal | ||
| + | | %e | Un nombre en virgule flottante, en notation scientifique | ||
| + | | %f | Un nombre en virgule flottante, avec un nombre de décimales fixe | | ||
| + | | %g | Un nombre en virgule flottante, %e ou %f (au mieux) | ||
| + | | %X | Comme %x mais avec des lettres majuscules | ||
| + | | %E | Comme %e, mais en utilisant un E majuscule (si nécessaire) | ||
| + | | %G | Comme %g, mais en utilisant un E majuscule (si nécessaire) | ||
| + | | %p | Un pointeur (affiche la valeur perl de l' | ||
| + | | espace | ||
| + | | + | Précède les nombres positifs par un signe plus | | ||
| + | | - | Justifie le champ à gauche | ||
| + | | 0 | Utilise des 0 à la place des espaces pour justifier à droite | ||
| + | | # | Précède le nombre non nul en octal par " | ||
| + | | : | Précède le nombre non nul en hexadécimal par " | ||
| + | | nombre | ||
| + | | .nombre | ||
| + | | l | Interprète un entier comme le type C " | ||
| + | | h | Interprète un entier comme le type C " | ||
| + | |||
| + | ==== Fonctions exécution ==== | ||
| + | |||
| + | <code perl> | ||
| + | exec(« cmd ») # exécute la commande, pas de valeur de retour et pas de retour au programme perl (sauf erreur) | ||
| + | system(« cmd ») # sortie console, attend la fin d’exécution. Valeur retournée code de retour de la commande. | ||
| + | qx(cmd) | ||
| + | # Code de retour dans variable $? | ||
| + | # Peut s’écrire qx(cmd), qx/cmd/ ou qx`cmd` | ||
| + | `cmd` # idem qx, écriture simplifiée. | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | ==== Fonctions Date/heure ==== | ||
| + | |||
| + | <code perl> | ||
| + | time # retourne le nombre de secondes depuis le 01/01/1970 | ||
| + | mktime | ||
| + | gmtime | ||
| + | localtime # retourne heure locale | ||
| + | strftime | ||
| + | </ | ||
| + | |||
| + | === Convertir un nombre de secondes depuis le 01/01/1970 === | ||
| + | |||
| + | <code perl> | ||
| + | my ($sec, $min, $hour, $day, $month, $year, $wday)=localtime(time()); | ||
| + | </ | ||
| + | |||
| + | Le mois retourné est une valeur entre 0 et 11, il faut donc ajouter 1. | ||
| + | |||
| + | L' | ||
| + | |||
| + | === Afficher en clair le résultat === | ||
| + | |||
| + | <code perl> | ||
| + | strftime(" | ||
| + | </ | ||
| + | |||
| + | === Convertir en nombre de secondes depuis le 01/01/1970 === | ||
| + | |||
| + | <code perl> | ||
| + | use POSIX ' | ||
| + | |||
| + | mktime(sec, | ||
| + | </ | ||
| + | |||
| + | ==== Fonctions diverses ==== | ||
| + | |||
| + | <code perl> | ||
| + | getlogin # donne le nom du login | ||
| + | exit # interruption du script avec code retour | ||
| + | sleep(x) # suspend l’exécution pendant x secondes | ||
| + | die # interruption avec message | ||
| + | alarm(x) # Met en place un SIGALARM à délivrer au processus après x secondes. Une seule horloge à la fois. alarm(0) pour annuler. | ||
| + | caller | ||
| + | crypt # crypte une chaîne de caractères | ||
| + | </ | ||
| + | |||
| + | === caller === | ||
| + | |||
| + | <code perl> | ||
| + | sub debug { | ||
| + | my ($package, $filename, $line, $subroutine) = caller(); | ||
| + | print "Appel depuis sous routine $subroutine du package $package du fichier $filename ligne $line\n"; | ||
| + | } | ||
| + | |||
| + | sub fonction { | ||
| + | debug(); | ||
| + | } | ||
| + | |||
| + | fonction(); | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Structures de contrôle ===== | ||
| + | |||
| + | ==== Boucles ==== | ||
| + | |||
| + | <code perl> | ||
| + | for (my $i=$n; $i > 0 ; $i--) { ... } # Boucle de $n à 1 | ||
| + | for $var (liste) { ... } # Parcourt la liste | ||
| + | foreach $var (liste) { ... } # Cette forme préserve la variable $var si utilisée avant | ||
| + | for (@tab) { ... } # Équivalent à for $_ (@tab) { ... } | ||
| + | while (...) { ... } | ||
| + | until (...) { ... } | ||
| + | do { ... } while (...) | ||
| + | </ | ||
| + | |||
| + | === Contrôle des itérations === | ||
| + | |||
| + | <code perl> | ||
| + | last # équivalent du break, sort de la boucle | ||
| + | next # équivalent du continue, passe à l' | ||
| + | redo # rejoue l' | ||
| + | </ | ||
| + | ==== Tests ==== | ||
| + | |||
| + | === Stucture classique === | ||
| + | |||
| + | <code perl> | ||
| + | if (...) { | ||
| + | } elsif (...) { | ||
| + | } else { | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === notation inversée (test à la fin) === | ||
| + | |||
| + | <code perl> | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | |||
| + | ==== Procédure / Fonctions ==== | ||
| + | |||
| + | <code perl> | ||
| + | sub toto { | ||
| + | les paramètres se retrouvent dans @_ : $_[0], $_[1], ... | ||
| + | return $retour ou bien return @retour pour retourner des paramètres | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code perl> | ||
| + | print @_." | ||
| + | print scalar(@_)." | ||
| + | print " | ||
| + | </ | ||
| + | |||
| + | === Passage de variables par adresse === | ||
| + | |||
| + | <code perl> | ||
| + | sub toto { | ||
| + | my $ref_tab1=$_[0] ; my $ref_tab2=$_[1] ; | ||
| + | my @tab1=@$ref_tab1 ; my %tab2=%$ref_tab2 ; | ||
| + | } | ||
| + | |||
| + | & | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | === Avec modification visible à l' | ||
| + | |||
| + | <code perl> | ||
| + | sub Ma_Fonction { | ||
| + | my ($hash1, $hash2, $hash3) = @_; | ||
| + | |||
| + | print "Cle 1 de hash toto = $hash1-> | ||
| + | print "Cle 1 de hash pouet = $hash2-> | ||
| + | print "Cle 1 de hash truc = $hash3-> | ||
| + | |||
| + | $hash1-> | ||
| + | } | ||
| + | |||
| + | Ma_Fonction(\%toto, | ||
| + | </ | ||
| + | |||
| + | <code perl> | ||
| + | sub toto { | ||
| + | my $ref_tab1=$_[0]; | ||
| + | | ||
| + | $ref_tab1-> | ||
| + | } | ||
| + | |||
| + | & | ||
| + | </ | ||
| + | |||
| + | === Retourner une table hash === | ||
| + | |||
| + | <code perl> | ||
| + | sub toto { | ||
| + | my %resultat; | ||
| + | ... | ||
| + | return (\%resultat); | ||
| + | } | ||
| + | |||
| + | my $ref=& | ||
| + | my %resultat=%$ref; | ||
| + | </ | ||
| + | |||
| + | ==== Gestion des erreurs ==== | ||
| + | |||
| + | === try / catch / finally === | ||
| + | |||
| + | <code perl> | ||
| + | use experimental ' | ||
| + | |||
| + | try { | ||
| + | appel_fonction(); | ||
| + | } | ||
| + | catch ($e) { | ||
| + | warn " | ||
| + | } | ||
| + | finally { | ||
| + | print " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === autodie === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <code perl> | ||
| + | eval { | ||
| + | use autodie; | ||
| + | |||
| + | open(my $fh, '<', | ||
| + | my @records = < | ||
| + | ... | ||
| + | close($fh); | ||
| + | }; | ||
| + | |||
| + | if ($@ and $@-> | ||
| + | if ($@-> | ||
| + | if ($@-> | ||
| + | } elsif ($@) { | ||
| + | # A non-autodie exception. | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== E/S ===== | ||
| + | |||
| + | ==== E/S standard ==== | ||
| + | |||
| + | === Handle de fichier === | ||
| + | |||
| + | <code perl> | ||
| + | STDIN # entrée standard (clavier) | ||
| + | STDOUT | ||
| + | STDERR | ||
| + | </ | ||
| + | |||
| + | === Exemples === | ||
| + | |||
| + | <code perl> | ||
| + | $var = < | ||
| + | @tab = < | ||
| + | print STDERR " | ||
| + | |||
| + | # saisie d'un mot de passe sans affichage à l' | ||
| + | do { | ||
| + | system(" | ||
| + | printf " | ||
| + | $pw=< | ||
| + | system(" | ||
| + | printf " | ||
| + | } while ($pw eq "" | ||
| + | </ | ||
| + | |||
| + | ==== Fichiers textes ==== | ||
| + | |||
| + | <code perl> | ||
| + | open(IN,"/ | ||
| + | open(OUT," | ||
| + | open(OUT,">/ | ||
| + | open(OUT,">>/ | ||
| + | open(IN," | ||
| + | print OUT " | ||
| + | close(OUT); | ||
| + | while (defined($ligne=< | ||
| + | foreach my $ligne (reverse(< | ||
| + | </ | ||
| + | |||
| + | === lecture d'un fichier ligne par ligne === | ||
| + | |||
| + | <code perl> | ||
| + | open(IN,"< | ||
| + | while (defined($ligne=< | ||
| + | chomp $ligne; | ||
| + | } | ||
| + | close IN; | ||
| + | </ | ||
| + | |||
| + | === lecture d'un fichier en entier dans un tableau === | ||
| + | |||
| + | <code perl> | ||
| + | open(IN,"< | ||
| + | my @lignes=< | ||
| + | close IN; | ||
| + | </ | ||
| + | |||
| + | === écriture dans un fichier ligne par ligne === | ||
| + | |||
| + | <code perl> | ||
| + | open(OUT,"> | ||
| + | for my $ligne (@lignes) { | ||
| + | print OUT " | ||
| + | } | ||
| + | close OUT; | ||
| + | </ | ||
| + | |||
| + | === Passage d'un filehandle dans une variable === | ||
| + | |||
| + | <code perl> | ||
| + | sub maproc { | ||
| + | my $filehandle=$_[0]; | ||
| + | my $nom_fichier=$_[1]; | ||
| + | | ||
| + | open($filehandle,"> | ||
| + | } | ||
| + | |||
| + | & | ||
| + | </ | ||
| + | |||
| + | === Encodage des caractères === | ||
| + | |||
| + | * En cas de problème d' | ||
| + | |||
| + | <code perl> | ||
| + | open(OUT,">: | ||
| + | </ | ||
| + | |||
| + | * Ajout un BOM (Byte Order Mark) en début de fichier | ||
| + | |||
| + | <code perl> | ||
| + | open(OUT,">: | ||
| + | print OUT " | ||
| + | </ | ||
| + | |||
| + | * Pour vérifier l' | ||
| + | |||
| + | <code bash> | ||
| + | file -i / | ||
| + | fichier.txt: | ||
| + | </ | ||
| + | |||
| + | * Possibilité d' | ||
| + | |||
| + | === chomp === | ||
| + | |||
| + | <code perl> | ||
| + | chomp $ligne; | ||
| + | chomp @tab; # vire le \n sur chaque élément | ||
| + | </ | ||
| + | |||
| + | ==== Modifier un fichier texte ==== | ||
| + | |||
| + | A l'aide de l' | ||
| + | |||
| + | <code perl> | ||
| + | use Tie::File; | ||
| + | |||
| + | tie(my @fichier,' | ||
| + | |||
| + | for (@fichier) { | ||
| + | s/< | ||
| + | } | ||
| + | |||
| + | untie @fichier; | ||
| + | </ | ||
| + | |||
| + | Toutes les fonctions habituelles sur les tableaux sont utilisables (push, pop, unshift, shift, splice) sauf qu' | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ==== Fonctions sur les fichiers ==== | ||
| + | |||
| + | <code perl> | ||
| + | @liste_fichiers = glob("/ | ||
| + | symlink($fichier, | ||
| + | readlink($toto); | ||
| + | unlink(@liste_de_fichier); | ||
| + | rename($file1, | ||
| + | move($file1, | ||
| + | copy($file1, | ||
| + | cp($file1, $file2); | ||
| + | $rep=getcwd(); | ||
| + | $rep=abs_path($chemin); | ||
| + | $rep=File:: | ||
| + | chdir($chemin); | ||
| + | dirname($fichier); | ||
| + | basename($fichier, | ||
| + | ($nom, | ||
| + | mkpath | ||
| + | rmtree | ||
| + | utime($a_time, | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | <note important> | ||
| + | |||
| + | === stat / lstat === | ||
| + | |||
| + | <code perl> | ||
| + | my @file_status=stat("/ | ||
| + | </ | ||
| + | |||
| + | Retourne un tableau avec les informations du fichier : | ||
| + | < | ||
| + | 0 dev device number of filesystem | ||
| + | 1 ino inode number | ||
| + | 2 mode file mode (type and permissions) | ||
| + | 3 nlink number of (hard) links to the file | ||
| + | 4 uid numeric user ID of file's owner | ||
| + | 5 gid numeric group ID of file's owner | ||
| + | 6 rdev the device identifier (special files only) | ||
| + | 7 size total size of file, in bytes | ||
| + | 8 atime last access time in seconds since the epoch | ||
| + | 9 mtime last modify time in seconds since the epoch | ||
| + | 10 ctime inode change time in seconds since the epoch (*) | ||
| + | 11 blksize | ||
| + | 12 blocks | ||
| + | </ | ||
| + | |||
| + | <note tip>La fonction lstat fait la même chose que stat mais fournit les données du lien symbolique au lieu du fichier pointé par le lien.</ | ||
| + | |||
| + | ==== Commandes système ==== | ||
| + | |||
| + | <code perl> | ||
| + | chmod(0700, | ||
| + | my $uid = getpwnam " | ||
| + | my $gid = getgrnam " | ||
| + | my $name = getpwuid($num); | ||
| + | ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwuid($uid); | ||
| + | ($group, $passwd, $gid, $members) = getgrgid($num); | ||
| + | chown($uid, | ||
| + | chroot(" | ||
| + | umask # retourne la valeur courante de umask | ||
| + | umask 0666 # retourne la valeur de umask et la position à la valeur 0666 | ||
| + | </ | ||
| + | |||
| + | ==== Test des fichiers et répertoires ==== | ||
| + | |||
| + | | -r | le fichier est en lecture | ||
| + | | -w | le fichier est en écriture | ||
| + | | -x | le fichier est exécutable | ||
| + | | -e | le fichier existe | ||
| + | | -Z | le fichier a une taille nulle | | ||
| + | | -s | le fichier n’a pas une taille nulle (retourne sa taille) | ||
| + | | -f | le fichier est un fichier normal | ||
| + | | -d | le fichier est un répertoire | | ||
| + | | -l | le fichier est un lien symbolique | ||
| + | | -S | le fichier est une socket | ||
| + | | -b | le fichier est un fichier de blocs spéciaux | ||
| + | | -u | le fichier a le bit setuid | ||
| + | | -g | le fichier a le bit setgid | ||
| + | | -k | le fichier a le sticky bit | | ||
| + | | -T | le fichier est un fichier texte | | ||
| + | | -B | le fichier est un fichier binaire | ||
| + | | -M | Age du fichier en jours quand le script a été lancé | ||
| + | | -A | idem pour le dernier accès au fichier | ||
| + | | -C | idem pour le dernier changement sur le fichier | ||
| + | |||
| + | ==== Manipulation de répertoire ==== | ||
| + | |||
| + | <code perl> | ||
| + | mkdir filename, | ||
| + | rmdir filename | ||
| + | </ | ||
| + | |||
| + | === Liste des fichiers dans un répertoire === | ||
| + | |||
| + | <code perl> | ||
| + | opendir(DIR, | ||
| + | @liste_fichier=readdir(DIR) ; | ||
| + | closedir(DIR) ; | ||
| + | </ | ||
| + | |||
| + | ou plus simplement avec la fonction glob : | ||
| + | |||
| + | <code perl> | ||
| + | @liste_fichier=glob("/ | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Parallelisme ===== | ||
| + | |||
| + | ==== fork ==== | ||
| + | |||
| + | <code perl> | ||
| + | use strict; | ||
| + | use warnings; | ||
| + | |||
| + | my $pid = fork(); | ||
| + | |||
| + | if (defined $pid) { | ||
| + | if ($pid == 0) { | ||
| + | # Processus enfant | ||
| + | print "Je suis le processus enfant, mon PID est $$\n"; | ||
| + | sleep(2); # on attend un peu | ||
| + | print " | ||
| + | } else { | ||
| + | # Processus parent | ||
| + | print "Je suis le processus parent, mon PID est $$, et le PID de mon enfant est $pid\n"; | ||
| + | waitpid($pid, | ||
| + | print " | ||
| + | } | ||
| + | } else { | ||
| + | die " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== multithreads ==== | ||
| + | |||
| + | Nécessite l' | ||
| + | |||
| + | <code bash> | ||
| + | cpan install threads | ||
| + | </ | ||
| + | |||
| + | <code perl> | ||
| + | use strict; | ||
| + | use warnings; | ||
| + | use threads; | ||
| + | use threads:: | ||
| + | |||
| + | # Variable partagée | ||
| + | my $shared_var :shared = 0; | ||
| + | |||
| + | # Fonction à exécuter dans un thread | ||
| + | sub worker { | ||
| + | my $thread_id = threads-> | ||
| + | { | ||
| + | lock $shared_var; | ||
| + | $shared_var++; | ||
| + | print " | ||
| + | } | ||
| + | sleep(1); # Simuler un travail | ||
| + | } | ||
| + | |||
| + | # Créer plusieurs threads | ||
| + | my @threads; | ||
| + | for my $i (1..3) { | ||
| + | push @threads, threads-> | ||
| + | } | ||
| + | |||
| + | # Attendre la fin de tous les threads | ||
| + | foreach my $thr (@threads) { | ||
| + | $thr-> | ||
| + | } | ||
| + | |||
| + | print " | ||
| + | </ | ||
| + | ---- | ||
| + | |||
| + | ===== Astuces ===== | ||
| + | |||
| + | ==== Session interractive ou non ==== | ||
| + | |||
| + | <code perl> | ||
| + | sub Is_interactive { | ||
| + | return -t STDIN && -t STDOUT; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Dos2Unix ==== | ||
| + | |||
| + | <code bash> | ||
| + | perl -i -pe ' | ||
| + | perl -i.bak -pe ' | ||
| + | </ | ||
| + | |||
| + | ==== Suppression d'une ligne particulière dans des fichiers ==== | ||
| + | |||
| + | <code bash> | ||
| + | perl -i -lne 'if (/ | ||
| + | perl -i.bak -lne 'if (/ | ||
| + | </ | ||
| + | |||
| + | ==== Compter un caractère sur chaque ligne d'un fichier ==== | ||
| + | |||
| + | Compte le nombre de ; par ligne d'un fichier | ||
| + | |||
| + | <code bash> | ||
| + | perl -lne 'my $count=tr/;/;/; | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== CPAN modules ===== | ||
| + | |||
| + | Des modules supplémentaires sont disponibles sur le site [[https:// | ||
| + | |||
| + | ==== Interface CPAN ==== | ||
| + | |||
| + | === Rechercher un module === | ||
| + | |||
| + | * Lancer la commande : | ||
| + | |||
| + | <code bash> | ||
| + | sudo perl -MCPAN -e shell | ||
| + | </ | ||
| + | |||
| + | * Recherche des modules parlant de JSON : | ||
| + | |||
| + | < | ||
| + | cpan[1]> i /json/ | ||
| + | </ | ||
| + | |||
| + | ==== Installation via cpanm ==== | ||
| + | |||
| + | === Installation cpanminus sur Ubuntu === | ||
| + | |||
| + | <code bash> | ||
| + | sudo apt install cpanminus | ||
| + | </ | ||
| + | |||
| + | === Installation cpanminus autrement === | ||
| + | |||
| + | <code bash> | ||
| + | sudo cpan App:: | ||
| + | </ | ||
| + | |||
| + | <note tip>Voir dépannage en cas d' | ||
| + | |||
| + | === Installer un module === | ||
| + | |||
| + | <code bash> | ||
| + | sudo cpanm < | ||
| + | sudo cpanm JSON | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | |||
| + | === Désinstaller un module === | ||
| + | |||
| + | <code bash> | ||
| + | sudo cpanm --uninstall < | ||
| + | </ | ||
| + | |||
| + | ==== Installation manuelle ==== | ||
| + | |||
| + | === Télécharger le module === | ||
| + | |||
| + | <code bash> | ||
| + | wget module.tar.gz | ||
| + | tar -xzf module.tar.gz | ||
| + | cd module | ||
| + | </ | ||
| + | |||
| + | === Compilation/ | ||
| + | |||
| + | <code bash> | ||
| + | perl Makefile.PL | ||
| + | make | ||
| + | make test | ||
| + | make install | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== JSON ===== | ||
| + | |||
| + | ==== Sauvegarde hash dans un fichier JSON ==== | ||
| + | |||
| + | === Ecriture === | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | use strict; | ||
| + | use JSON; | ||
| + | |||
| + | my %hash=( | ||
| + | ' | ||
| + | ' | ||
| + | ); | ||
| + | # création objet JSON | ||
| + | my $json = JSON-> | ||
| + | # conversion hash en JSON | ||
| + | my $json_text = $json-> | ||
| + | # sauvegarde dans un fichier | ||
| + | open(OUT,"> | ||
| + | print OUT " | ||
| + | close OUT; | ||
| + | </ | ||
| + | |||
| + | === Lecture === | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | use strict; | ||
| + | use JSON; | ||
| + | |||
| + | # Lire le fichier JSON | ||
| + | open(IN,"< | ||
| + | my $json_text = do { local $/; <IN> }; | ||
| + | close IN; | ||
| + | |||
| + | # Convertir le JSON en hash Perl | ||
| + | my $hash_ref = JSON-> | ||
| + | </ | ||
| + | |||
| + | ==== Concaténation de 2 fichiers ==== | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | use strict; | ||
| + | use warnings; | ||
| + | use JSON; | ||
| + | use Data:: | ||
| + | |||
| + | # Initialisation du parser JSON | ||
| + | my $json = JSON-> | ||
| + | |||
| + | # Noms des fichiers | ||
| + | my $file1 = ' | ||
| + | my $file2 = ' | ||
| + | |||
| + | sub readJSONfromfile { | ||
| + | my $file=$_[0]; | ||
| + | |||
| + | local $/; | ||
| + | open(IN,"< | ||
| + | my $content = <IN>; | ||
| + | close IN; | ||
| + | return $json-> | ||
| + | } | ||
| + | |||
| + | # Fonction récursive pour fusionner deux hashes | ||
| + | sub merge_hashes { | ||
| + | my ($hash1, $hash2) = @_; | ||
| + | my %result = %{$hash1}; | ||
| + | |||
| + | for my $key (keys %{$hash2}) { | ||
| + | if (exists $result{$key}) { | ||
| + | if (ref($result{$key}) eq ' | ||
| + | $result{$key} = merge_hashes($result{$key}, | ||
| + | } elsif (ref($result{$key}) eq ' | ||
| + | push @{$result{$key}}, | ||
| + | } else { # Pour les autres cas, on garde la valeur du second fichier | ||
| + | $result{$key} = $hash2-> | ||
| + | } | ||
| + | } else { # Si la clé n' | ||
| + | $result{$key} = $hash2-> | ||
| + | } | ||
| + | } | ||
| + | return \%result; | ||
| + | } | ||
| + | |||
| + | # Lecture et décodage du premier fichier JSON | ||
| + | my $data1=& | ||
| + | print " | ||
| + | print Dumper($data1); | ||
| + | |||
| + | # Lecture et décodage du second fichier JSON | ||
| + | my $data2=& | ||
| + | print " | ||
| + | print Dumper($data2); | ||
| + | |||
| + | # Fusion des données selon leur type | ||
| + | my $merged_data; | ||
| + | |||
| + | if (ref($data1) eq ' | ||
| + | $merged_data = [@$data1, @$data2]; | ||
| + | } elsif (ref($data1) eq ' | ||
| + | $merged_data = merge_hashes($data1, | ||
| + | } else { | ||
| + | die "Les fichiers doivent contenir soit deux objets, soit deux tableaux JSON"; | ||
| + | } | ||
| + | |||
| + | print " | ||
| + | print Dumper($merged_data); | ||
| + | |||
| + | # Encodage du résultat en JSON avec indentation | ||
| + | my $result = $json-> | ||
| + | |||
| + | # Écriture dans un nouveau fichier | ||
| + | my $output_file = ' | ||
| + | open(my $out, '>', | ||
| + | print $out $result; | ||
| + | close($out); | ||
| + | |||
| + | print " | ||
| + | </ | ||
| + | |||
| + | ==== Validation ==== | ||
| + | |||
| + | === Validation par rapport à un schéma === | ||
| + | |||
| + | Utilisation du module JSON:: | ||
| + | |||
| + | |||
| + | <code perl> | ||
| + | use JSON; | ||
| + | use JSON:: | ||
| + | |||
| + | if (-s " | ||
| + | open(IN," | ||
| + | my $json_text = do { local $/; <IN> }; | ||
| + | close IN; | ||
| + | $cfg = JSON-> | ||
| + | |||
| + | } else { | ||
| + | erreur(" | ||
| + | } | ||
| + | my $schema = { | ||
| + | type => ' | ||
| + | required => [' | ||
| + | properties => { | ||
| + | url => { type => ' | ||
| + | ports => { | ||
| + | type => ' | ||
| + | }, | ||
| + | services => { | ||
| + | type => ' | ||
| + | items => { type => ' | ||
| + | }, | ||
| + | serveurs => { | ||
| + | type => ' | ||
| + | items => { | ||
| + | type => ' | ||
| + | required => [' | ||
| + | properties => { | ||
| + | nom => { type => ' | ||
| + | IP => { type => ' | ||
| + | tcp => { | ||
| + | type => ' | ||
| + | items => { | ||
| + | type => ' | ||
| + | minimum => 1, | ||
| + | maximum => 65535 | ||
| + | } | ||
| + | }, | ||
| + | udp => { | ||
| + | type => ' | ||
| + | items => { | ||
| + | type => ' | ||
| + | minimum => 1, | ||
| + | maximum => 65535 | ||
| + | } | ||
| + | }, | ||
| + | url => { | ||
| + | type => ' | ||
| + | items => { type => ' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | }; | ||
| + | my $validator = JSON:: | ||
| + | $validator-> | ||
| + | my @errors = $validator-> | ||
| + | if (@errors) { | ||
| + | for my $err (@errors) { | ||
| + | print " | ||
| + | } | ||
| + | erreur(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | === Validation en ligne === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== module CGI ===== | ||
| + | |||
| + | Il est possible de gérer des requêtes http au travers du module CGI. | ||
| + | |||
| + | * Activer l' | ||
| + | |||
| + | <code bash> | ||
| + | sudo a2enmod cgid | ||
| + | </ | ||
| + | |||
| + | * Préciser la localisation des scripts CGI dans la conf du site : | ||
| + | |||
| + | <code apache> | ||
| + | | ||
| + | </ | ||
| + | |||
| + | * Copier le script dans le répertoire sans oublier de le rendre exécutable | ||
| + | |||
| + | ==== Récupération de paramètres d'une requête http ==== | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | |||
| + | use strict; | ||
| + | use warnings; | ||
| + | use CGI; | ||
| + | |||
| + | # Créer un nouvel objet CGI | ||
| + | my $cgi = CGI-> | ||
| + | |||
| + | # Récupérer les paramètres de la requête POST | ||
| + | my $param1 = $cgi-> | ||
| + | my $param2 = $cgi-> | ||
| + | |||
| + | # Imprimer l' | ||
| + | print $cgi-> | ||
| + | |||
| + | # Afficher les valeurs reçues | ||
| + | print "< | ||
| + | print "< | ||
| + | print "< | ||
| + | print "< | ||
| + | print "</ | ||
| + | </ | ||
| + | |||
| + | ==== Récupération d'un fichier JSON au travers d'une requête http ==== | ||
| + | |||
| + | === En affichant les données === | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | |||
| + | use strict; | ||
| + | use warnings; | ||
| + | use CGI; | ||
| + | use JSON; | ||
| + | |||
| + | # Créer un nouvel objet CGI | ||
| + | my $cgi = CGI-> | ||
| + | |||
| + | # Récupérer les données de la requête POST | ||
| + | my $json_text = $cgi-> | ||
| + | |||
| + | # Vérifier si des données ont été reçues | ||
| + | if (defined $json_text) { | ||
| + | # Convertir le JSON en structure de données Perl | ||
| + | my $data; | ||
| + | eval { | ||
| + | $data = decode_json($json_text); | ||
| + | }; | ||
| + | if ($@) { | ||
| + | print $cgi-> | ||
| + | print encode_json({ error => " | ||
| + | exit; | ||
| + | } | ||
| + | |||
| + | # Imprimer l' | ||
| + | print $cgi-> | ||
| + | |||
| + | # Faire quelque chose avec les données reçues (par exemple, les afficher) | ||
| + | print encode_json({ received => $data }); | ||
| + | } else { | ||
| + | print $cgi-> | ||
| + | print encode_json({ error => "No data received" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === En enregistrant les données dans un fichier === | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | |||
| + | use strict; | ||
| + | use warnings; | ||
| + | use CGI; | ||
| + | use JSON; | ||
| + | |||
| + | # pretty pour identation | ||
| + | # canonical pour trier en fonction des clefs | ||
| + | my $JSON = JSON-> | ||
| + | |||
| + | my $filename = " | ||
| + | |||
| + | # Créer un nouvel objet CGI | ||
| + | my $cgi = CGI-> | ||
| + | |||
| + | # Récupérer les données de la requête POST | ||
| + | my $json_text = $cgi-> | ||
| + | |||
| + | # Vérifier si des données ont été reçues | ||
| + | if (defined $json_text) { | ||
| + | # Convertir le JSON en structure de données Perl | ||
| + | my $data; | ||
| + | eval { | ||
| + | $data = decode_json($json_text); | ||
| + | }; | ||
| + | if ($@) { | ||
| + | print $cgi-> | ||
| + | print "< | ||
| + | print "< | ||
| + | print "</ | ||
| + | } else { | ||
| + | if (open(OUT,"> | ||
| + | my $json=$JSON-> | ||
| + | print OUT " | ||
| + | close OUT; | ||
| + | print $cgi-> | ||
| + | print "< | ||
| + | print "< | ||
| + | print "</ | ||
| + | } else { | ||
| + | print $cgi-> | ||
| + | print "< | ||
| + | print "< | ||
| + | print "</ | ||
| + | } | ||
| + | } | ||
| + | } else { | ||
| + | print $cgi-> | ||
| + | print "< | ||
| + | print "< | ||
| + | print "</ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Compilation en un exécutable ===== | ||
| + | |||
| + | < | ||
| + | |||
| + | ==== Installation modules CPAN ==== | ||
| + | |||
| + | < | ||
| + | cpanm PAR | ||
| + | cpanM PAR::Packer | ||
| + | </ | ||
| + | |||
| + | ==== Utilisation ==== | ||
| + | |||
| + | <code bash> | ||
| + | pp -o fichier.exe fichier.pl | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Programmation objet ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Caractères UTF-8 sous Windows ===== | ||
| + | |||
| + | Ajouter les lignes suivantes en début de script : | ||
| + | |||
| + | <code perl> | ||
| + | use utf8; | ||
| + | use open qw(:std :utf8); | ||
| + | binmode(STDOUT, | ||
| + | </ | ||
| + | |||
| + | ==== Terminal Windows ==== | ||
| + | |||
| + | === Unitairement === | ||
| + | |||
| + | * Avant l' | ||
| + | |||
| + | <code bash> | ||
| + | chcp 65001 | ||
| + | </ | ||
| + | |||
| + | ==== PowerShell ==== | ||
| + | |||
| + | === unitairement === | ||
| + | |||
| + | * Avant l' | ||
| + | |||
| + | <code bash> | ||
| + | $OutputEncoding = [System.Text.Encoding]:: | ||
| + | [Console]:: | ||
| + | </ | ||
| + | |||
| + | * Vérification | ||
| + | |||
| + | <code bash> | ||
| + | [Console]:: | ||
| + | </ | ||
| + | |||
| + | === De façon persistante === | ||
| + | |||
| + | * exécuter | ||
| + | |||
| + | <code bash> | ||
| + | if (!(Test-Path $PROFILE)) { | ||
| + | New-Item -Type File -Path $PROFILE -Force | ||
| + | } | ||
| + | echo $PROFILE | ||
| + | </ | ||
| + | |||
| + | * puis éditer le fichier Microsoft.PowerShell_profile.ps1 pour y ajouter | ||
| + | |||
| + | <code bash> | ||
| + | # Configuration pour UTF-8 | ||
| + | $OutputEncoding = [System.Text.Encoding]:: | ||
| + | [Console]:: | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== Dépannage ===== | ||
| + | |||
| + | ==== Debug ==== | ||
| + | |||
| + | <code bash> | ||
| + | perl –d fichier.pl # | ||
| + | # !/ | ||
| + | </ | ||
| + | |||
| + | ==== Can't locate common.pm in @INC ==== | ||
| + | |||
| + | Par défaut le répertoire courant n'est pas dans la variable @INC, il faut donc éventuellement l' | ||
| + | |||
| + | <code perl> | ||
| + | # | ||
| + | use warnings; | ||
| + | use strict; | ||
| + | use Cwd; | ||
| + | use File:: | ||
| + | |||
| + | my $BINDIR; | ||
| + | my $PRGNAME; | ||
| + | my $EXT; | ||
| + | |||
| + | BEGIN { | ||
| + | ($PRGNAME, | ||
| + | unshift(@INC, | ||
| + | } | ||
| + | |||
| + | use common; | ||
| + | </ | ||
| + | |||
| + | ==== Impossible d' | ||
| + | |||
| + | Lors de l' | ||
| + | |||
| + | < | ||
| + | Couldn' | ||
| + | </ | ||
| + | |||
| + | Tenter l' | ||
| + | |||
| + | <code bash> | ||
| + | sudo curl -L http:// | ||
| + | </ | ||
| + | |||
| + | ---- | ||
