Le langage PERL, exercices


  1. Notions de base
  2. Listes
  3. Expressions rationnelles
  4. Fichiers
  5. Fonctions
  6. CGI

Notions de base

Enoncés

  1. Le programme attend la saisie du coté d'un carré et affiche son périmètre et son aire.
  2. Le programme attend la saisie de mots successifs jusqu'à la saisie de "quit" ou de "z"
  3. L'utilisateur doit fournir un mot de passe. Celui-ci sera indéfiniment demandé tant qu'il n'est pas trouvé ou qu'on saisisse "quit"
  4. Calcul de la somme des N premiers entiers non nuls

Corrigés

  1. #!/usr/bin/perl
    print "La demande sera arrêtée par la saisie de la lettre \"z\" ou \"Z\" \n";
    $i=0;
    while () {
    chop($_);
    if (($_ eq "z") || ($_ eq "Z")) {
    last;
    }
    else {
    $i= $i + 1;
    print "Mot numero $i ---> $_\n";
    }
    }
  2. #!/usr/bin/perl
    print "Trouvez le mot de passe, sinon pour finir tapez quit\n";
    # compteur d'essai
    $i=0;
    $secret="perl";
    $mot=  ;
    chop($mot);
    while (($mot ne $secret) && ($mot ne "quit")) {
     print "Trouvez le mot de passe, ou "quit" pour finir\n";
     $mot=  ;
     chop($mot);
     $i++;
    }
    if ($mot eq "quit") {
     print "Mot de passe non trouvé, au revoir ...\n";
     } else {
      print "Mot de passe trouve a la $i eme tentative, bienvenue !\n";
    }
  3. #!/usr/bin/perl
    if (defined $ARGV[0]) {
    $N=$ARGV[0];
    print "Calcul de la somme des $N premiers entiers non nuls\n";
    } else {
    print "Calcul de la somme des N premiers entiers non nuls : ";
    print "N = "; 
    $N=;
    if ($N==0) { $N=10; }
    }
    for ($i=1; $i<=$N; $i++) {
    $s= $s+$i ;
    print "Somme 1+..+$i = $s\n";
    }

Listes

Enoncés

  1. Le programme lit un chiffre n et une liste de chaine; il doit afficher l'élément numéro n.
  2. Création d'une liste des mots successifs saisis, jusqu'à la saisie du mot "quit"

Corrigés

  1. Création d' une liste de mots saisis

Listes associatives

Enoncés

  1. Création d'une liste associative %comptes, dont les clés sont les noms des login des comptes et les valeurs corresponadantes sont les UID

Corrigés

  1. Création d'une liste associative %comptes

Expressions rationnelles

Enoncés

  1. Recherche des comptes commencant par un nom de connexion à saisir et affichage de la ligne correspondante
  2. Recherche des comptes d'uid supérieur à 500, et affichage individuel des champs de chaque compte trouvé. Donner si possible 2 solutions.
  3. Même question pour les comptes compris entre 500 et 519

Corrigés

  1. #!/usr/bin/perl
    # exercice expr6
    print "Recherche des comptes commencant par : ";
    $nom = ;
    chop($nom);
    
    $passwd="/etc/passwd";
    open(IN, $passwd);
    print "--------------------------------\n";
    while ($ligne=) {
    chomp($ligne);
    $i++;
    if ($ligne =~ /^($nom)/) {
    print "Ligne numero $i ---> $ligne\n";
    }
    }
  2. solution 1
    #!/usr/bin/perl 
    $fichier="/etc/passwd";
    print "Voici la liste des comptes d'uid supérieur à 500 du fichier $fichier\n";
    open(F, $fichier); $l=0;
    while (<F>) {
     chomp(); $l++;
     @champs= split(/:/);
     ($login,$p,$uid,$gid,$nom,$home,$shell)=@champs;
    # print "user num $l ---> @champs\n";
     if ($uid >= 500) {
     print "$login, $p, $uid, $gid, $nom, $home, $shell\n";
     }
    } 
    solution 2
    #!/usr/bin/perl 
    $fichier="/etc/passwd";
    print "Voici la liste des comptes d'uid supérieur à 500 du fichier $fichier\n";
    open(F, $fichier); $l=0;
    while (<F>) {
     chomp();
     if (/:x:[56789]\d\d:/) {
     ($login,$p,$uid,$gid,$nom,$home,$shell)=split(/:/);
     print "$login, $uid, $gid, $nom\n";
     }
    }
  3. #!/usr/bin/perl 
    $fichier="/etc/passwd";
    print "Voici la liste des comptes d'uid de 500 à 519 de $fichier\n";
    open(F, $fichier); $l=0;
    while () {
     chomp(); 
     if (/:x:[5][01]\d:/) {
     ($login,$p,$uid,$gid,$nom,$home,$shell)=split(/:/);
     print "$login, $uid, $gid, $nom\n";
     }
    }
    close();
    

Enoncés

Corrigés