======================================================================
 Modern::Open ÚÛÙ¹ Ø´ÛÙ¹                         [UR] Ø§Ø±Ø¯Ù
======================================================================

[ 1. Installation / [UR] Ø§Ø±Ø¯Ù ]

  Ø§ÙØ³Ù¹Ø§Ù Ú©Ø±ÛÚº:
    cpan Modern::Open

  Ø§Ø³Ú©Ø±Ù¾Ù¹ ÙÛÚº Ø§Ø³ØªØ¹ÙØ§Ù:
    use Modern::Open;

  Ø§Ø«Ø±: open()Ø opendir()Ø sysopen()Ø pipe()Ø socket()
       Ø§ÙØ± accept() Ú©Ù autovivification + autodie ÙØ±ÚÙ Ø³Û Ø¨Ø¯ÙØªØ§ ÛÛÛ
       Perl 5.005_03 Ø§ÙØ± Ø§Ø³ Ú©Û Ø¨Ø¹Ø¯ Ú©Û ØªÙØ§Ù ÙØ±ÚÙ Ù¾Ø± Ú©Ø§Ù Ú©Ø±ØªØ§ ÛÛÛ
       نوٹ: socket() autovivification کو سپورٹ کرتی ہے لیکن autodie نہیں کرتی۔

[ 2. open() -- 2-arg ]

  my $fh;
  open($fh, "< file.txt");   # Ù¾ÚÚ¾ÛÚº
  open($fh, "> file.txt");   # ÙÚ©Ú¾ÛÚº (Ø§ÙÙØ± Ø±Ø§Ø¦Ù¹)
  open($fh, ">> file.txt");  # Ø´Ø§ÙÙ Ú©Ø±ÛÚº
  open($fh, "+< file.txt");  # Ù¾ÚÚ¾ÛÚº/ÙÚ©Ú¾ÛÚº
  open($fh, "cmd |");        # Ú©ÙØ§ÙÚ Ù¾Ø§Ø¦Ù¾ Ø³Û Ù¾ÚÚ¾ÛÚº
  open($fh, "| cmd");        # Ú©ÙØ§ÙÚ Ù¾Ø§Ø¦Ù¾ ÙÛÚº ÙÚ©Ú¾ÛÚº

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

[ 3. open() -- 3-arg ]

  my $fh;
  open($fh, '<',  "file.txt");   # Ù¾ÚÚ¾ÛÚº
  open($fh, '>',  "file.txt");   # ÙÚ©Ú¾ÛÚº (Ø§ÙÙØ± Ø±Ø§Ø¦Ù¹)
  open($fh, '>>', "file.txt");   # Ø´Ø§ÙÙ Ú©Ø±ÛÚº
  open($fh, '+<', "file.txt");   # Ù¾ÚÚ¾ÛÚº/ÙÚ©Ú¾ÛÚº
  open($fh, '+>', "file.txt");   # Ù¾ÚÚ¾ÛÚº/ÙÚ©Ú¾ÛÚº (Ø§ÙÙØ± Ø±Ø§Ø¦Ù¹)
  open($fh, '-|', "cmd");        # Ú©ÙØ§ÙÚ Ù¾Ø§Ø¦Ù¾ Ø³Û Ù¾ÚÚ¾ÛÚº
  open($fh, '|-', "cmd");        # Ú©ÙØ§ÙÚ Ù¾Ø§Ø¦Ù¾ ÙÛÚº ÙÚ©Ú¾ÛÚº

[ 4. opendir() ]

  my $dh;
  opendir($dh, "/path/to/dir");
  while (my $e = readdir($dh)) {
      next if $e eq '.' or $e eq '..';
      print "$e\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 "ÚØ§Ø¦ÙÚ Ù¾Ø±ÙØ³ÛØ³ Ø³Û Ø³ÙØ§Ù\n";
      close($writer);
      exit 0;
  }

[ 7. socket() / accept() ]

  use Socket qw(AF_INET SOCK_STREAM sockaddr_in inet_aton);
  my $server;
  socket($server, AF_INET, SOCK_STREAM, 0);
  # نوٹ: socket() autodie نہیں کرتی؛ واپسی قدر خود جانچیں۔
  my $client;
  accept($client, $server);

[ 8. autodie ]

  # void context: ÙØ§Ú©Ø§ÙÛ Ù¾Ø± die
  open($fh, "< no_such_file.txt");   # dies: Can't open(...)

  # ÙØ§Ù¾Ø³Û ÙØ¯Ø± Ú©Û Ø³Ø§ØªÚ¾: ÙØ§Ú©Ø§ÙÛ Ù¾Ø± undef/0
  my $rc = open($fh, "< file.txt");
  unless ($rc) { warn "open ÙØ§Ú©Ø§Ù: $!" }

  open(FILE, "< file.txt");   # dies: Bare handle no longer supported

[ 9. Handle ]

  readline($fh)        # Ø§ÛÚ© ÙØ§Ø¦Ù Ù¾ÚÚ¾ÛÚº
  read($fh, $buf, $n)  # N Ø¨Ø§Ø¦Ù¹ Ù¾ÚÚ¾ÛÚº
  print $fh "..."      # ÙÚ©Ú¾ÛÚº
  binmode($fh)         # Ø¨Ø§Ø¦ÙØ±Û ÙÙÚ
  seek($fh, 0, 0)      # Ø´Ø±ÙØ¹ ÙÛÚº Ø¬Ø§Ø¦ÛÚº
  tell($fh)            # ÙÙØ¬ÙØ¯Û Ù¾ÙØ²ÛØ´Ù
  close($fh)           # Ø¨ÙØ¯ Ú©Ø±ÛÚº
  eof($fh)             # ÙØ§Ø¦Ù Ú©Ø§ Ø¢Ø®Ø± ÚÛÚ© Ú©Ø±ÛÚº

[ 10. Compatibility ]

  Perl ÙØ±ÚÙ : 5.005_03 Ø§ÙØ± Ø¨Ø¹Ø¯ Ú©Û (5.42 Ø³ÙÛØª)
  Ù¾ÙÛÙ¹ ÙØ§Ø±Ù  : Unix, Linux, macOS, Windows (CRLF Ø®ÙØ¯Ú©Ø§Ø±)
  Ø§ÙØ­ØµØ§Ø±     : Fcntl (Ø¨ÙÛØ§Ø¯Û ÙØ§ÚÛÙÙ)

[ 11. Official resources ]

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

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

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