Outils pour utilisateurs

Outils du site


perl:utilisation_des_fichiers

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
perl:utilisation_des_fichiers [2009/03/15 13:54] – modification externe 127.0.0.1perl:utilisation_des_fichiers [2013/03/12 23:36] (Version actuelle) root
Ligne 1: Ligne 1:
 +====== Les fichiers ======
 +
 ====== 1. Descripteurs ====== ====== 1. Descripteurs ======
  
Ligne 6: Ligne 8:
  
 Perl peut également manipuler ces descripteurs avec deux types de syntaxe. La syntaxe "ancienne" ou traditionnelle utilise des noms en majuscules avec uniquement des lettres, et ne sont jamais déclarés et assignés. La portée de ces descripteurs est globale : Perl peut également manipuler ces descripteurs avec deux types de syntaxe. La syntaxe "ancienne" ou traditionnelle utilise des noms en majuscules avec uniquement des lettres, et ne sont jamais déclarés et assignés. La portée de ces descripteurs est globale :
 +<code perl>
   open(TEXT, ">text");   open(TEXT, ">text");
   print TEXT "Bonjour le monde.\n";   print TEXT "Bonjour le monde.\n";
   close(TEXT);   close(TEXT);
 +</code>
  
 La deuxième syntaxe, plus "attendue" permet d'utiliser une variable standard et donc locale (il s'agit en fait d'une référence vers un descripteur) : La deuxième syntaxe, plus "attendue" permet d'utiliser une variable standard et donc locale (il s'agit en fait d'une référence vers un descripteur) :
 +<code perl>
   open(my $text, ">text");   open(my $text, ">text");
   print $text "Bonjour le monde.\n";   print $text "Bonjour le monde.\n";
   close($text);   close($text);
 +</code>
  
 Notons qu'il existe une version moderne (orienté objet) qui requiert l'utilisation d'un module spécifique (cf //man filehandle//) : Notons qu'il existe une version moderne (orienté objet) qui requiert l'utilisation d'un module spécifique (cf //man filehandle//) :
 +<code perl>
   use FileHandle;   use FileHandle;
      
Ligne 21: Ligne 28:
   print $text "Bonjour le monde.\n";   print $text "Bonjour le monde.\n";
   $text->close();   $text->close();
 +</code>
  
 ===== Descripteurs implicites ===== ===== Descripteurs implicites =====
Ligne 51: Ligne 59:
  
 Il est important de noter qu'avec l'utilisation de variables classiques Perl, un fichier est automatiquement fermé dès que l'on quitte la portée de la variable : Il est important de noter qu'avec l'utilisation de variables classiques Perl, un fichier est automatiquement fermé dès que l'on quitte la portée de la variable :
 +<code perl>
   sub log_error {   sub log_error {
   open(my $log, ">>error.log") or die;   open(my $log, ">>error.log") or die;
   print $log @_;   print $log @_;
   }   }
 +</code>
  
 ===== Avec des programmes ===== ===== Avec des programmes =====
  
 On peut facilement reproduire le mécanisme du "pipe" utilisé dans le shell, c'est-à-dire relier sur l'entrée ou la sortie standard un autre programme : On peut facilement reproduire le mécanisme du "pipe" utilisé dans le shell, c'est-à-dire relier sur l'entrée ou la sortie standard un autre programme :
 +<code perl>
   open(MAIL, "|sendmail -bi") or die;   open(MAIL, "|sendmail -bi") or die;
   print MAIL "From: eleve@insia.org\r\nSubject: test\r\n";   print MAIL "From: eleve@insia.org\r\nSubject: test\r\n";
Ligne 68: Ligne 79:
   }   }
   close FILES;   close FILES;
 +</code>
  
 Ceci implique bien entendu que Perl se charge d'exécuter ces programmes à votre demande, c'est une forme altrenative d'invocation de commande (cf. //system// et l'opérateur //backtick//). Ceci implique bien entendu que Perl se charge d'exécuter ces programmes à votre demande, c'est une forme altrenative d'invocation de commande (cf. //system// et l'opérateur //backtick//).
Ligne 83: Ligne 95:
  
 Dans ce cas on peut utiliser les appels systèmes POSIX standard : Dans ce cas on peut utiliser les appels systèmes POSIX standard :
 +<code perl>
   use Fcntl; # Imports O_xxx constants   use Fcntl; # Imports O_xxx constants
      
Ligne 93: Ligne 106:
   }   }
   close FILE;   close FILE;
 +</code>
  
 ===== Mode binaire ===== ===== Mode binaire =====
Ligne 105: Ligne 119:
  
 On peut lire une quantité de donnée quelconque depuis un fichier simplement à l'aide de //read// : On peut lire une quantité de donnée quelconque depuis un fichier simplement à l'aide de //read// :
 +<code perl>
   read(FILE, $buffer, 1500);   read(FILE, $buffer, 1500);
   read(FILE, $buffer, 1500, 2000); # Lit à partir du 2000ème octet   read(FILE, $buffer, 1500, 2000); # Lit à partir du 2000ème octet
   seek(FILE, 5000); # Positionne le curseur de lecture au 5000ème octet   seek(FILE, 5000); # Positionne le curseur de lecture au 5000ème octet
 +</code>
  
 ===== Par enregistrement ===== ===== Par enregistrement =====
  
 Il s'agit de l'utilisation de loin la courante en Perl, elle est même intégrée en tant qu'opérateur : //<>//. Le séparateur d'enregistrement peut être modifiée à tout moment à l'aide de la variable spéciale //$/// (qui désigne le retour chariot par défaut) : Il s'agit de l'utilisation de loin la courante en Perl, elle est même intégrée en tant qu'opérateur : //<>//. Le séparateur d'enregistrement peut être modifiée à tout moment à l'aide de la variable spéciale //$/// (qui désigne le retour chariot par défaut) :
 +<code perl>
   $/ = "\n\n"; # Découpe en "paragraphes"   $/ = "\n\n"; # Découpe en "paragraphes"
   while (<FILE>) {   while (<FILE>) {
   print "<p> $_ </p>\n";   print "<p> $_ </p>\n";
   }   }
 +</code>
  
 L'opérateur renvoie le dernier enregistrement lu, ou //undef// si la fin du fichier est rencontré. Il est ainsi traditionnellement appelé dans le test d'une boucle //while//, l'enregistrement courant étant alors implicitement dans la variable //$_//. L'opérateur renvoie le dernier enregistrement lu, ou //undef// si la fin du fichier est rencontré. Il est ainsi traditionnellement appelé dans le test d'une boucle //while//, l'enregistrement courant étant alors implicitement dans la variable //$_//.
  
 Il est possible de lire un fichier entier en un seul appel en utilisant la chaîne vide comme séparateur : Il est possible de lire un fichier entier en un seul appel en utilisant la chaîne vide comme séparateur :
 +<code perl>
   $/ = "";   $/ = "";
   my $whole = <FILE>; # Lit tout le fichier dans $whole   my $whole = <FILE>; # Lit tout le fichier dans $whole
-  +</code> 
 **Note**: une technique alternative, empruntée au shell serait //my $whole = `cat $filename`;//. **Note**: une technique alternative, empruntée au shell serait //my $whole = `cat $filename`;//.
  
Ligne 131: Ligne 150:
  
 Il existe de nombreuses fonctions de formattage, dont les fameux //print//, //printf//, //write// et //format// : Il existe de nombreuses fonctions de formattage, dont les fameux //print//, //printf//, //write// et //format// :
 +<code perl>
   print FILE "Une information...\n";   print FILE "Une information...\n";
 +</code>
  
 **Note**: //write// n'est **pas** le pendant de //read// ! (Il n'est pas nécessaire, il suffit de manipuler les chaînes et uiliser //seek//). **Note**: //write// n'est **pas** le pendant de //read// ! (Il n'est pas nécessaire, il suffit de manipuler les chaînes et uiliser //seek//).
Ligne 139: Ligne 159:
  
 Il est possible de changer momentanément le fichier de sortie par défaut, ce qui permet de rediriger facilement la sortie d'un sous-programme sans avoir à le modifier : Il est possible de changer momentanément le fichier de sortie par défaut, ce qui permet de rediriger facilement la sortie d'un sous-programme sans avoir à le modifier :
 +<code perl>
   make_report(); # Sortie sur STDOUT   make_report(); # Sortie sur STDOUT
   my $previous = select(LOG);   my $previous = select(LOG);
   make_report(); # Sortie dans LOG   make_report(); # Sortie dans LOG
   select($previous);   select($previous);
 +</code>
  
 ===== Bufferisation ===== ===== Bufferisation =====
Ligne 151: Ligne 171:
  
 On peut facilement outrepasser ce cache, par exemple pour la sortie courante (STDOUT par défaut, mais cf. //select//) : On peut facilement outrepasser ce cache, par exemple pour la sortie courante (STDOUT par défaut, mais cf. //select//) :
 +<code perl>
   $| = 1; # Autoflush = 1   $| = 1; # Autoflush = 1
 +</code>
  
 Et il existe une syntaxe plus générique fonctionnant sur tous les descripteurs de fichiers, mais elle nécessite le module orienté objet : Et il existe une syntaxe plus générique fonctionnant sur tous les descripteurs de fichiers, mais elle nécessite le module orienté objet :
 +<code perl>
   use FileHandle;   use FileHandle;
      
   open(my $tty, ">/dev/tty");   open(my $tty, ">/dev/tty");
   $tty->autoflush(1);   $tty->autoflush(1);
 +</code>
perl/utilisation_des_fichiers.1237125265.txt.gz · Dernière modification : 2013/03/12 23:36 (modification externe)