Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2016年のPerl (Long version)

1,964 views

Published on

YAPC::Hokkaido 2016

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2016年のPerl (Long version)

  1. 1. 2016 年の Perl (Long version) Kenichi Ishigaki @charsbar YAPC::Hokkaido 2016 Dec 10, 2016
  2. 2. Perl 5 in 2016
  3. 3. Perl 5.24 was releasedSome of the notable changes: • Hashbang redirection to Perl 6 • autoderef was gone, postderef in • Unicode 8.0 support • Lexical $_ has been removed • /C/ character class has been removed • Nested declarations are not disallowed • chdir('') no longer chdirs home • sysread()/syswrite() and :utf8 handles • Performance enhancements • Several security fixes
  4. 4. Good old hashbang redirection $ cat > hello.sh #!/bin/sh echo "Hello, World"; $ perl hello.sh Hello, World $ cat > hello.pl #!/usr/bin/env perl -w print "Hello, Worldn"; $ perl hello.pl Hello, World
  5. 5. New hashbang redirection to Perl 6 $ cat > hello.p6 #!/home/ishigaki/.rakudobrew/bin/perl6 use v6; say "Hello, World"; $ perl5200 hello.p6 Perl v6.0.0 required--this is only v5.20.0, stopped at hello.p6 line 2. BEGIN failed--compilation aborted at hello.p6 line 2. $ perl5240 hello.p6 Hello, World
  6. 6. auto-dereferencing • push $arrayref //= [], $scalar; • for (keys $hashref) { ... } • introduced in 5.14 • experimental since 5.18
  7. 7. auto-dereferencing is gone × push $blessed_arrayref, $scalar; × for (keys $blessed_hashref) { ... } × print "interpolates $arrayref";
  8. 8. • push $arrayref->@*, $scalar; • push $blessed_arrayref->@*, $scalar; • print "interpolates $arrayref->@*"; • experimental since 5.20 postderef is no longer experimental
  9. 9. postderef is no longer experimental △ $undef->%* # warning × $maybe_undef->%* // {} ○ ($maybe_undef // {})->%* × keys ($maybe_hashref // {})->%* ○ keys (($maybe_hashref // {})->%*) ○ keys %{$maybe_hashref // {}} # shorter...
  10. 10. Unicode 8.0 plackup -MEncode -e 'use 5.024; sub {[ 200, ["Content-Type" => "text/plain"], [encode_utf8("N{TACO} N{POPCORN}")], ]}'
  11. 11. Unicode 8.0: Emoji Modifier plackup -MEncode -e 'use 5.024; sub {[ 200, ["Content-Type" => "text/plain"], [encode_utf8( "N{WOMAN}" . "N{EMOJI MODIFIER FITZPATRICK TYPE-5}" . " " . "N{MAN}" )], ]}'
  12. 12. Lexical $_ has been removed • for my $_ (...) { ... } • implicitly used in given/when ( ~ 5.16) • has been experimental since 5.18. • See perl5180delta for details
  13. 13. /C/ character class has been removed my $c = "N{U+3042}"; # あ say unpack "H*", $c; # e38182 $c =~ /(.)/; say sprintf "%x", $1; # 3042 $c =~ /(C)/; say sprintf "%x", $1; # e3 $c =~ s/(CC)C/$1x84/; say $c; # い • deprecated since 5.20
  14. 14. Nested declarations are not disallowed my ($x, my($y)); # croaks now our (my $x); # ditto
  15. 15. chdir(undef) no longer chdirs home chdir(undef) or die "since 5.24"; # but with no warning
  16. 16. sysread()/syswrite() are deprecated on :utf8 handles use strict; use warnings; open my $fh, '<:encoding(cp932)', 'test.txt'; # works as you expect read($fh, my $buf, 3); # doesn't respect the encoding; now warns sysread($fh, my $buf, 3);
  17. 17. Performance enchancements • The overhead of scope entry/exit is considerably reduced (subroutine calls, loops, and basic blocks become all faster) • /fixed-string/ become much faster (in many cases) • arithmetic become faster
  18. 18. Security fixes • Perl 5.22 set a wrong umask before calling mkstemp(3) • Out of boundary access in Win32 path handling (since 5.005) • File::Spec::canonpath lost taint (since 5.20: PathTools-3.47) • Avoid accessing uninitialized memory in win32 crypt() • On duplicate environment variables from environ[]
  19. 19. See perldelta (perl5240delta) for other changes
  20. 20. Some of the coming features/changes (Perl 5.26) • Unescaped literal { in regexp is not allowed (5.25.1) • Lexical subroutines are no longer experimental (5.25.2) • ${^ENCODING} has been removed (5.25.3) • Unicode 9.0 support (5.25.3) • Indented Here-documents (5.25.7) • Build option to exclude . in @INC (5.25.7)
  21. 21. Unescaped literal { in regexp $foo =~ /d{1,10}/; # ok $foo =~ /d{1}/; # ok $foo =~ /something{}/; # now dies $foo =~ /something{/; # now dies $foo =~ /something[{]/; # ok $foo =~ /something{/; # ok $foo =~ /{}/; # still ok • deprecated since 5.16
  22. 22. Lexical subroutines are no longer experimental { sub whatever { my $x = shift; my sub inner { ... do something with $x ... } inner(); } } perldoc perlsyn for details • experimental since 5.18
  23. 23. ${^ENCODING} has been removed × use encoding 'cp932'; ○ use encoding 'cp932', Filter => 1;
  24. 24. Good old Here-documents { my ($key, $value) = qw/foo bar/; my $json_template = << "END"; {"$key": "$value"} END }
  25. 25. Indented Here-documents { my ($key, $value) = qw/foo bar/; my $json_template = <<~ "END"; {"$key": "$value"} END }
  26. 26. Build option to exclude . in @INC $ plenv install 5.25.7 -Ddefault_inc_excludes_dot • Beware if you use inc::Module::Install, t:: for testing libraries, do "localfile.pl" for configuration, etc. • This issue would probably be mitigated somehow (by toolchainers). • Your system perl may have been built with the same option for security reasons. • FindBin is always your friend.
  27. 27. See perl525[1-9]delta for other changes
  28. 28. Changes in the Community • Karen Pauley stepped down as TPF President • Perl 5 Pumpking: Ricardo Signes to Sawyer X • YAPC to The Perl Conferences 2017.06.18-23 (Alexandria, Virginia, USA) 2017.08.09-11 (Amsterdam, Netherlands)
  29. 29. Other Perl Events happened in 2016 • Various Perl Workshops (Dutch, German, French, Alpine, Barcelona, London, DC-Baltimore, etc) • QA Hackathon in Rugby • meta::hack • Perl Dancer Conference 2016
  30. 30. CPAN Status • 12915 PAUSE IDs (JP: 601) • 34607 Distributions As of Dec 10, 2016
  31. 31. CPAN Status As of Dec 10, 2016 Number of releases Year Worldwide Japanese 2012 22647 1858 2013 25760 3225 2014 27269 1937 2015 22999 1108 2016 18898 731
  32. 32. CPAN Status As of Dec 10, 2016 Number of released distributions Year Worldwide Japanese 2012 6777 539 2013 7442 804 2014 7586 566 2015 6823 407 2016 5957 306
  33. 33. CPAN Status As of Dec 10, 2016 Number of new distributions Year Worldwide Japanese 2012 2947 (of 6777;43%) 248 (of 539;46%) 2013 2836 (of 7442;38%) 420 (of 804;52%) 2014 2805 (of 7586;37%) 220 (of 566;39%) 2015 2249 (of 6823;33%) 123 (of 407;30%) 2016 2072 (of 5957;35%) 77 (of 306;25%)
  34. 34. CPAN Status As of Dec 10, 2016 Number of authors who released Year Worldwide Japanese 2012 1758 123 2013 1803 150 2014 1716 130 2015 1553 115 2016 1371 95
  35. 35. CPAN Status As of Dec 10, 2016 Number of authors who released something new Year Worldwide Japanese 2012 1047 (of 1758;60%) 78 (of 123;63%) 2013 1012 (of 1803;56%) 113 (of 150;75%) 2014 898 (of 1716;52%) 78 (of 130;60%) 2015 734 (of 1553;47%) 66 (of 115;57%) 2016 608 (of 1371;44%) 38 (of 95;40%)
  36. 36. CPAN Status App:: (375), Locale::CLDR::Locales:: (196), Net:: (195), Dist::Zilla::Plugin:: (141), Test:: (129), Bencher:: (119), Acme:: (117), Mojolicious::Plugin:: (104), Data:: (104), WWW:: (101), Text:: (77), WebService:: (68), Dancer2:: (67), Alien:: (64), HTML:: (64), DBIx:: (60), Math:: (60), File:: (59), Log:: (59)... Notable namespaces updated in 2016
  37. 37. CPAN Status Char:: (35), App:: (14), Test:: (13), Plack::Middleware:: (12), Acme:: (10), Data:: (8), WebService:: (8), Redis (7), HTML:: (7), Net:: (7), Mojolicious::Plugin:: (6), DBIx:: (5), WWW:: (5), Text:: (5), Perl:: (4), SQL::(4), Net::Azure:: (4), AnyEvent (4), Dist:: (4)... Ditto by Japanese
  38. 38. Perl 6 in 2016
  39. 39. THE Christmas has come! ... as Larry announced last year.
  40. 40. Now we have the Christmas ROAST • Repository Of All Spec Tests • "6.c" branch/tag in perl6/roast • We also have Rakudo that doesn't die by "use v6.c".
  41. 41. $ perl6 -v This is Rakudo version 2016.11 built on MoarVM version 2016.11 implementing Perl 6.c. • say $*PERL.name; # Perl 6 • say $*PERL.version; # v6.c • say $*PERL.compiler.name; # rakudo • say $*PERL.compiler.version; # v2016.11 • say $*VM.name; # moar • say $*VM.version; # v2016.11
  42. 42. Not everything is ready yet "spectest" (made from roast) is fudged. given $*DISTRO.name { when "macosx" { #?rakudo.jvm skip "file system events NYI? RT #124828" subtest &macosx, "does watch-path work on Mac OS X"; } default { pass "Nothing reliable to test yet"; } } perl6/roast/S17-supply/watch-path.t (for IO::Notification.watch-path)
  43. 43. However, Rakudo is fairly STABLE now ... as long as you use the tested features.
  44. 44. README for ROAST 6.c says: Any tests that contain a "use experimental" are not considered part of the specification, and their behavior is subject to change. Anything not explicitly tested here is experimental. https://github.com/perl6/roast/blob/6.c/README#L8-L10
  45. 45. See the ROAST 6.c when in doubt • Design docs explain goals; not the current status. • 6.c-errata
  46. 46. Performance and Reliability Among others, Jonathan Worthington... •completed his first 200-hours Perl 6 Performance and Reliability Grant •implemented heap snapshots in MoarVM •improved lower-level (ie. largely MoarVM) performance •fixed a number of memory leaks and concurrency bugs •This Grant has been extended for another 200 hours. http://news.perlfoundation.org/2016/08/perl-6-performance-and- reliabi-1.html
  47. 47. According to a benchmark: https://twitter.com/zoffix/status/796810512986238978
  48. 48. On other backends
  49. 49. Rakudo on JVM • not included in Rakudo Star distributions now • much slower than Rakudo on MoarVM but improving
  50. 50. Rakudo.js • http://blogs.perl.org/users/pawel_murias/2016/10/update-on- rakudojs.html • http://blogs.perl.org/users/pawel_murias/2016/10/rakudojs- update.html • Work In Progress (P6 Grant) • ECMAScript 6
  51. 51. Farewell to Parrot • First Perl6 backend since 2001 • Related code was removed from nqp https://p6weekly.wordpress.com/2016/08/01/2016-31-an-end-of- an-era/
  52. 52. Release Utilities • Ticket Trakr • IRC release bot • http://blogs.perl.org/users/zoffix_znet/2016/08/i-botched-a- perl-6-release-and-now-a-robot-is-taking-my-job.html • https://github.com/rakudo/rakudo/blob/nom/docs/release_gu ide_automated.md
  53. 53. TAP for Perl 6 • Tests in ROAST are written in Perl 6, but p5 Test::Harness is still used to run the tests. • New TAP.pm6 has been written to replace it. https://p6weekly.wordpress.com/2016/08/22/2016-34-a- quick-botch-from-cluj/
  54. 54. Some of the (coming) features Not only grammars and concurrency but also... • Unicode support, not just to read/write • TWEAK (equiv to BUILD of p5 Moose) • lexical module loading
  55. 55. Unicode support say 「こんにちはこんにちは」 ; # 半角「 」 のみ my $ 税率 = 1.08; ($ 金額 ×$ 税率 ).say; say 100² ÷ ⅕; # 50000; say 100 ** 2 / unival("x[2155]");
  56. 56. TWEAK submethod Consider you want to set "id" automatically. use v6.c; class Foo { has ($.x, $!id); submethod BUILD() { $!id = $!x * 2; # $!x is not set yet } method generated_id { $!id } } say Foo.new(x => 1).generated_id; # 0
  57. 57. TWEAK submethod You can write like this, but... use v6.c; class Foo { has ($.x, $!id); submethod BUILD(:$!x) { $!id = $!x * 2; } method generated_id { $!id } } say Foo.new(x => 1).generated_id; # 2
  58. 58. TWEAK submethod use v6.c; # since 2016.11 (or v6.d when ready) class Foo { has ($.x, $!id); submethod TWEAK() { # called after BUILDs $!id = $!x * 2; } method generated_id { $!id } } say Foo.new(x => 1).generated_id; # 2
  59. 59. Lexical module load not merged yet; this will break modules that depend on old, Perl5-like behavior. # A.pm6 class A {} # B.pm6 use A; class B {} # test_lexical_module_load.pl6 use B; A.new; # should die because A is not used here
  60. 60. Perl 6 Ecosystem ~750 modules as of 2016/12 https://modules.perl6.org/
  61. 61. Perl 6 Ecosystem Don't worry: you can use numerous Perl5 modules via Inline::Perl5. use v6.c use Inline::Perl5; use DBI:from<Perl5>; my $dbh = DBI.connect('dbi:Pg:database=test'); my $products = $dbh.selectall_arrayref( 'select * from products', {Slice => {}} );
  62. 62. PSIXDISTS Perl5 toolchain ignores distribution under PAUSE_ID/Perl6/ directory. http://cpan.metacpan.org/authors/id/P/PS/PSIXDISTS/Perl6/
  63. 63. Writing a Perl 6 module $ panda install App::Mi6 $ mi6 new Your::Great::Module
  64. 64. Learning Perl 6 • Perl 6 Advent Calendars https://perl6advent.wordpress.com/ See also tests under roast/integration/ http://qiita.com/advent-calendar/2016/perl6 http://qiita.com/advent-calendar/2015/perl6 • Perl 6 Introduction: http://ja.perl6intro.com • RosettaCode https://rosettacode.org/wiki/Category:Perl_6 • roast • perl6.org
  65. 65. Perl 6 Books Planned/In-Progress • Learning Perl 6 (brian d foy) https://www.kickstarter.com/projects/1422827986/learning-perl-6 • Perl 6 By Example (Moritz Lenz) https://perlgeek.de/blog-en/perl-6/2016-book.html
  66. 66. Further Information • Weekly changes in and around Perl 6 https://p6weekly.wordpress.com • English videos about Perl 6 on YouTube http://bit.ly/perl6_english_video • WEB+DB PRESS Vol.93 「 Perl 6 の歩き 方」 http://gihyo.jp/dev/serial/01/perl-hackers-hub/003901 • About the next version (6.d) https://github.com/perl6/specs/blob/master/v6d.pod https://github.com/rakudo/rakudo/blob/nom/docs/language_
  67. 67. Thank you

×