======================================================================
 Perl7::Handy à¤à¤¿à¤ à¤¸à¤¿à¤                   [NE] à¤¨à¥à¤ªà¤¾à¤²à¥
======================================================================

[ 1. Installation ]

  à¤¸à¥à¤¥à¤¾à¤ªà¤¨à¤¾:
    cpan Perl7::Handy

  à¤¸à¥à¤à¥à¤°à¤¿à¤ªà¥à¤à¤®à¤¾ à¤ªà¥à¤°à¤¯à¥à¤:
    use Perl7::Handy;

  à¤ªà¥à¤°à¤­à¤¾à¤µ (Perl 5.010001 à¤° à¤ªà¤à¤¿):
    * use strict               -- à¤à¤° à¤à¥à¤·à¤£à¤¾ à¤à¤¨à¤¿à¤µà¤¾à¤°à¥à¤¯ à¤à¤°à¥à¤
    * use warnings             -- à¤à¥à¤¤à¤¾à¤µà¤¨à¥à¤¹à¤°à¥ à¤¸à¤à¥à¤·à¤® à¤à¤°à¥à¤
    * no bareword::filehandles -- open(FILE,...) à¤¶à¥à¤²à¥ à¤à¤¸à¥à¤µà¥à¤à¤¾à¤° à¤à¤°à¥à¤
    * no multidimensional      -- $hash{a,b} à¤à¤¨à¥à¤à¤°à¤£ à¤à¤à¥à¤·à¤® à¤à¤°à¥à¤
    * use feature qw(signatures)  (Perl 5.020+)
    * no feature qw(indirect)     (Perl 5.031009+)

  à¤ªà¥à¤°à¤­à¤¾à¤µ (Perl 5.005_03 -- 5.008):
    * use strict
    * open/opendir/sysopen/pipe/socket/accept à¤à¤à¥à¤µà¤¿à¤µà¤¿à¤«à¤¿à¤à¥à¤¶à¤¨
    # socket() असफल भएमा autodie गर्दैन (void context मा false फर्काउँछ)
    * tie à¤à¤§à¤¾à¤°à¤¿à¤¤ $; à¤ªà¤¾à¤¸à¥ (à¤¬à¤¹à¥à¤à¤¯à¤¾à¤®à¥ à¤à¤°à¥ à¤à¤¨à¥à¤à¤°à¤£ à¤°à¥à¤à¥à¤¨à¥)

[ 2. open() -- autovivification ]

  my $fh;
  open($fh, "< file.txt");   # à¤ªà¤¢à¥à¤¨à¥à¤¹à¥à¤¸à¥
  open($fh, "> file.txt");   # à¤²à¥à¤à¥à¤¨à¥à¤¹à¥à¤¸à¥ (à¤à¤­à¤°à¤°à¤¾à¤à¤)
  open($fh, ">> file.txt");  # à¤¥à¤ªà¥à¤¨à¥à¤¹à¥à¤¸à¥
  open($fh, "+< file.txt");  # à¤ªà¤¢à¥à¤¨à¥à¤¹à¥à¤¸à¥/à¤²à¥à¤à¥à¤¨à¥à¤¹à¥à¤¸à¥
  while (my $line = readline($fh)) { ... }
  print $fh "text\n";
  close($fh);

  # bareword à¤¹à¥à¤¯à¤¾à¤¨à¥à¤¡à¤² à¤à¤¸à¥à¤µà¥à¤à¥à¤¤:
  open(FILE, "< file.txt");   # dies: Use of bareword handle in open

[ 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() / sysopen() ]

  my $dh;
  opendir($dh, "/path/to/dir");
  while (my $e = readdir($dh)) {
      next if $e eq '.' or $e eq '..';
      print "$e\n";
  }
  closedir($dh);

  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, 0644);

[ 5. 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;
  }

[ 6. socket() / accept() ]

  use Socket qw(AF_INET SOCK_STREAM sockaddr_in inet_aton);
  my $server;
  socket($server, AF_INET, SOCK_STREAM, 0);
  # नोट: socket() असफल भएमा autodie गर्दैन; return value स्पष्ट रूपमा जाँच्नुहोस्।
  my $client;
  accept($client, $server);

[ 7. no bareword::filehandles ]

  # bareword à¤¹à¥à¤¯à¤¾à¤¨à¥à¤¡à¤² à¤à¤¸à¥à¤µà¥à¤à¥à¤¤:
  open(FILE, "< file.txt");    # error: Bareword filehandle
  print FILE "hello\n";        # error: Bareword filehandle

  # à¤²à¥à¤à¥à¤¸à¤¿à¤à¤² à¤­à¥à¤°à¤¿à¤à¤¬à¤² à¤ªà¥à¤°à¤¯à¥à¤ à¤à¤°à¥à¤¨à¥à¤¹à¥à¤¸à¥:
  my $fh;
  open($fh, "< file.txt");
  print $fh "hello\n";
  close($fh);

[ 8. no multidimensional ]

  # à¤¬à¤¹à¥à¤à¤¯à¤¾à¤®à¥ à¤¹à¥à¤¯à¤¾à¤¸ à¤à¤¨à¥à¤à¤°à¤£ à¤à¤à¥à¤·à¤®:
  my %h;
  $h{1,2} = "val";    # error: Use of multidimensional array emulation

  # à¤¸à¥à¤ªà¤·à¥à¤ à¤à¥à¤à¥à¤à¥ à¤ªà¥à¤°à¤¯à¥à¤ à¤à¤°à¥à¤¨à¥à¤¹à¥à¤¸à¥:
  $h{"$x,$y"} = "val";

[ 9. Signatures (Perl 5.020+) ]

  # à¤¸à¤¿à¤à¥à¤¨à¥à¤à¤° à¤¸à¥à¤µà¤à¤¾à¤²à¤¿à¤¤ à¤¸à¤à¥à¤·à¤®; à¤ªà¥à¤°à¤¯à¥à¤à¤¾à¤¤à¥à¤®à¤ à¤à¥à¤¤à¤¾à¤µà¤¨à¥ à¤¦à¤¬à¤¾à¤à¤à¤à¥
  use Perl7::Handy;

  sub greet($name) { return "Hello, $name!" }
  sub add($x, $y)  { return $x + $y }

[ 10. no indirect (Perl 5.031009+) ]

  # à¤à¤ªà¥à¤°à¤¤à¥à¤¯à¤à¥à¤· à¤µà¤¸à¥à¤¤à¥ à¤¸à¤¿à¤¨à¥à¤à¥à¤¯à¤¾à¤à¥à¤¸ à¤à¤à¥à¤·à¤®:
  my $obj = new MyClass;   # error: indirect syntax

  # à¤ªà¥à¤°à¤¤à¥à¤¯à¤à¥à¤· à¤¸à¤¿à¤¨à¥à¤à¥à¤¯à¤¾à¤à¥à¤¸ à¤ªà¥à¤°à¤¯à¥à¤ à¤à¤°à¥à¤¨à¥à¤¹à¥à¤¸à¥:
  my $obj = MyClass->new;

[ 11. CVE-2016-1238 ]

  # Perl7::Handy à¤¸à¥à¤à¤¾à¤°à¥à¤à¤à¤ªà¤®à¤¾ @INC à¤¬à¤¾à¤ à¤¹à¤¾à¤²à¤à¥ à¤¡à¤¾à¤à¤°à¥à¤à¥à¤à¤°à¥ à¤¹à¤à¤¾à¤à¤à¤à¥¤
  # BEGIN { pop @INC if $INC[-1] eq '.' }

[ 12. à¤¸à¤à¤¸à¥à¤à¤°à¤£ à¤à¤¨à¥à¤à¥à¤²à¤¤à¤¾ à¤®à¥à¤¯à¤¾à¤à¥à¤°à¤¿à¤à¥à¤¸ ]

  Feature              5.005_03  5.006-009  5.010+  5.020+  5.031009+
  -------------------  --------  ---------  ------  ------  ---------
  strict               yes       yes        yes     yes     yes
  warnings             no        yes        yes     yes     yes
  autovivif. open()    yes       yes        yes*    yes*    yes*
  no bareword FH       emulated  emulated   yes     yes     yes
  no multidim.         tie       tie        yes     yes     yes
  signatures           no        no         no      yes     yes
  no indirect          no        no         no      no      yes

[ 13. Official resources ]

  Perl7::Handy (MetaCPAN):
    https://metacpan.org/dist/Perl7-Handy

  bareword::filehandles:
    https://metacpan.org/dist/bareword-filehandles

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

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