TP Tableaux et listes



Informations

 TP élémentaires

####################### exo1.pl parcours d'une liste #########################

Etudier les exemples, si nécessaire corriger et compléter
-------------------------------------------
#!/usr/bin/perl -w
@liste1 = (lundi  mardi mercredi jeudi vendredi samedi dimanche);
print "affichage global :\n";
print @liste1,"\n";
print "@liste1\n";
print "taille de \@liste1 = ... \n";
print "son dernier élément est : ...\n";

print "affichage de \@liste1, élément par élément de 2 façons :\n";
print "\navec une boucle indicée for :\n";
   ...
print "\navec une boucle foreach :\n";
   ...

####################### exo2.pl manipulations de listes #####################

Commenter les instructions suivantes, et prévoir très précisément les affichages avant d'expérimenter
--------------------------------------------
#!/usr/bin/perl -w
@alpha = ('a'..'z'); @liste = (@alpha,0..9);
$el = $liste[3];
print "$el\n";
($a, $b, $c, @reste) = @liste ;
print "\$a= $a, \$b= $b, \$c =$c , \@reste= @reste\n";
($b, $a)= ($a, $b);
print "\$a= $a, \$b= $b \n";
$el = pop @liste;
print "\$el= $el, \@liste= @liste\n";
$el = shift @liste;
print "\$el= $el, \@liste= @liste\n";
print "\@alpha est la liste \n@alpha\n";
for ($i=0; $i<26 ; $i++) {
  $el= pop @alpha;
  unshift @alpha, $el;
}
print "\@alpha est maintenant \n@alpha\n";

##################### exo3.pl Saisie d'une liste #######################

Commenter les instructions suivantes, prévoir les affichages
--------------------------------------------
#!/usr/bin/perl -w
# pour placer la chaine saisie dans la variable $ligne
# rappel : le descripteur STDIN lié à l'entrée standard peut etre omis
$ligne = <STDIN>
# pour l'afficher à l'écran, au lieu de print STDOUT $ligne;
print $ligne;

# Pour lire une à une les lignes saisies, on utilise une construction while
# pour sortir de cette boucle : ctrl-D
while ($ligne = <>) {
# pour enlever le caractère "fin de ligne"
chomp($ligne) ;
# pour placer la ligne dans le tableau
@texte = (@texte, $ligne);
}
print "@texte\n"

################# exo4.pl créer une liste à partir d'un fichier #################

Sur un système UNIX, les comptes utilisateurs sont décrits dans un simple fichier texte /etc/passwd.
On souhaite récupérer ce fichier dans une liste. Voici la structure des enregistrements de ce fichier :
############# extrait de /etc/passwd ####################
jean:x:500:500::/home/jean:/bin/bash
thierry:x:501:501::/home/thierry:/bin/bash
admin:x:502:502::/home/admin:/bin/bash
#########################################################
  1. Compléter et commenter l'exécution du script
  2. Donner 2 façons de remettre le compte root en tête de la liste @comptes
--------------------------------------------
#!/usr/bin/perl -w
# ouvrir le fichier /etc/passwd en lecture
open P,"/etc/passwd";
# lire la première ligne, puis tout le reste
$root = ....
print $root,"\n";
@comptes = <P>;
print "\$root = $root\n";
print "2ème élément de \@comptes = ...\n";
# afficher le dernier compte :
print "Dernier compte créé dans \@comptes = ...\n";
# pour placer $root en 1ère place dans @comptes
.....

################### exo5.pl liste des comptes utilisateurs ##################

Il s'agit de rechercher les comptes utilisateurs sur un système Unix de numéros (3ème champ) supérieurs à 500 (en effet dans beaucoup de distributions les numéros internes de comptes (uid) commencent à 500 (ceci est réglable dans /etc/login.defs).
On demande d'afficher les champs suivants : nom, uid, répertoire personnel en complétant le script ci-dessous)
  1. ouvrir le fichier /etc/passwd et extraire chaque ligne dans une boucle
  2. utiliser la fonction split() pour mettre les champs de chaque ligne dans une liste @champs
  3. comparer à 500 le champ entier contenant l'UID (c'est le 3ème champ).
  4. présenter une 2ème solution, en récupérant d'un coup le contenu du fichier
  5. Prolongement : compléter en trouvant le groupe principal et la liste des groupes secondaires
--------------------------------------------
#!/usr/bin/perl -w
$fichier="/etc/passwd";
print "Liste des comptes d'uid supérieur à 500\n";
open F, $fichier;
while (<F>) {
 chomp();
 @champs= ....
 if ( ... >= 500) {
 print " ....\n";
 }
}

################## exo6.pl Construire une concaténation de listes #################

Il s'agit de récupérer et de placer dans une (seule) liste nommée @liste, toutes les lignes contenues dans 3 fichiers. Si on n'a pas de meilleure idée, utiliser /etc/passwd, /etc/group et /etc/fstab
  1. construire @fichiers, la liste de ces noms de fichiers
  2. construire une boucle de parcours de @fichiers, dans laquelle on ouvre chaque fichier en lecture et on empile dans @liste leur contenu
  3. afficher la liste @liste pour vérifier
--------------------------------------------