======================================================================
 Modern::Open Aide-mémoire                              [FR] Français
======================================================================

[ 1. Installation et utilisation ]

  Installation:
    cpan Modern::Open

  Dans votre script:
    use Modern::Open;

  Effet: remplace open(), opendir(), sysopen(), pipe(), socket(),
         et accept() par des versions avec autovivification + autodie.
         Compatible avec Perl 5.005_03 et toutes les versions suivantes.
         Note: socket() prend en charge l'autovivification mais pas l'autodie.

[ 2. open() -- forme à 2 arguments ]

  my $fh;
  open($fh, "< file.txt");   # lecture
  open($fh, "> file.txt");   # écriture (écrasement)
  open($fh, ">> file.txt");  # ajout en fin
  open($fh, "+< file.txt");  # lecture/écriture
  open($fh, "cmd |");        # lecture depuis un tube
  open($fh, "| cmd");        # écriture vers un tube

  while (my $line = readline($fh)) { ... }
  print $fh "text\n";
  close($fh);

[ 3. open() -- forme à 3 arguments ]

  my $fh;
  open($fh, '<',  "file.txt");   # lecture
  open($fh, '>',  "file.txt");   # écriture (écrasement)
  open($fh, '>>', "file.txt");   # ajout en fin
  open($fh, '+<', "file.txt");   # lecture/écriture
  open($fh, '+>', "file.txt");   # lecture/écriture (écrasement)
  open($fh, '-|', "cmd");        # lecture depuis un tube
  open($fh, '|-', "cmd");        # écriture vers un tube

  # La forme à 3 arguments utilise CORE::sysopen en interne.
  # Le nom de fichier ne sera jamais analysé pour les caractères de mode.

[ 4. opendir() ]

  my $dh;
  opendir($dh, "/chemin/vers/dossier");

  while (my $entry = readdir($dh)) {
      next if $entry eq '.' or $entry eq '..';
      print "$entry\n";
  }
  closedir($dh);

[ 5. sysopen() ]

  use Fcntl qw(O_RDONLY O_WRONLY O_CREAT O_TRUNC);

  my $fh;
  sysopen($fh, "file.txt", O_RDONLY);
  sysopen($fh, "file.txt", O_WRONLY | O_CREAT | O_TRUNC);
  sysopen($fh, "file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);

[ 6. pipe() ]

  my($reader, $writer);
  pipe($reader, $writer);

  if (my $pid = fork()) {
      close($writer);
      while (my $line = readline($reader)) { print $line }
      close($reader);
  } else {
      close($reader);
      print $writer "Bonjour du processus enfant\n";
      close($writer);
      exit 0;
  }

[ 7. socket() et accept() ]

  use Socket qw(AF_INET SOCK_STREAM sockaddr_in inet_aton);

  my $server;
  socket($server, AF_INET, SOCK_STREAM, 0);
  # Note: socket() ne fait pas autodie; vérifiez sa valeur de retour.

  my $client;
  accept($client, $server);

[ 8. Comportement autodie ]

  # Contexte vide (sans récupérer la valeur): die en cas d'échec
  open($fh, "< fichier_inexistant.txt");   # dies: Can't open(...)

  # Avec récupération de la valeur: retourne undef/0 en cas d'échec
  my $rc = open($fh, "< file.txt");
  unless ($rc) { warn "Échec open: $!" }

  # Les handles nus sont refusés:
  open(FILE, "< file.txt");   # dies: Bare handle no longer supported

[ 9. Handle retourné ]

  readline($fh)        # lire une ligne
  read($fh, $buf, $n)  # lire N octets
  print $fh "..."      # écrire
  binmode($fh)         # mode binaire
  seek($fh, 0, 0)      # aller au début
  tell($fh)            # position courante
  close($fh)           # fermer
  eof($fh)             # fin de fichier

[ 10. Compatibilité ]

  Versions Perl : 5.005_03 et suivantes (y compris 5.42)
  Plateformes   : Unix, Linux, macOS, Windows (CRLF géré)
  Dépendances   : Fcntl (module principal)

[ 11. Ressources officielles ]

  Modern::Open (MetaCPAN):
    https://metacpan.org/dist/Modern-Open

  INABA Hitoshi (ina) on CPAN:
    https://metacpan.org/author/INA

======================================================================
