2016年のperl (long version)
TRANSCRIPT
2016 年の Perl(Long version)
Kenichi Ishigaki@charsbar
YAPC::Hokkaido 2016Dec 10, 2016
Perl 5 in 2016
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
Good old hashbang redirection
$ cat > hello.sh#!/bin/shecho "Hello, World";
$ perl hello.shHello, World
$ cat > hello.pl#!/usr/bin/env perl -wprint "Hello, World\n";
$ perl hello.plHello, World
New hashbang redirection to Perl 6
$ cat > hello.p6#!/home/ishigaki/.rakudobrew/bin/perl6use v6;say "Hello, World";
$ perl5200 hello.p6Perl 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.p6Hello, World
auto-dereferencing
• push $arrayref //= [], $scalar;• for (keys $hashref) { ... }
• introduced in 5.14• experimental since 5.18
auto-dereferencing is gone
× push $blessed_arrayref, $scalar;× for (keys $blessed_hashref) { ... }× print "interpolates $arrayref";
• push $arrayref->@*, $scalar;• push $blessed_arrayref->@*, $scalar;• print "interpolates $arrayref->@*";
• experimental since 5.20
postderef is no longer experimental
postderef is no longer experimental
△ $undef->%* # warning× $maybe_undef->%* // {}○ ($maybe_undef // {})->%*× keys ($maybe_hashref // {})->%*○ keys (($maybe_hashref // {})->%*)○ keys %{$maybe_hashref // {}} # shorter...
Unicode 8.0
plackup -MEncode -e 'use 5.024; sub {[ 200, ["Content-Type" => "text/plain"], [encode_utf8("\N{TACO} \N{POPCORN}")],]}'
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}" )],]}'
Lexical $_ has been removed
• for my $_ (...) { ... }• implicitly used in given/when ( ~
5.16)• has been experimental since 5.18.• See perl5180delta for details
/\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/(\C\C)\C/$1\x84/; say $c; # い
• deprecated since 5.20
Nested declarations are not disallowed
my ($x, my($y)); # croaks now our (my $x); # ditto
chdir(undef) no longer chdirs home
chdir(undef) or die "since 5.24";# but with no warning
sysread()/syswrite() are deprecated on :utf8
handlesuse strict;use warnings;open my $fh, '<:encoding(cp932)', 'test.txt';
# works as you expectread($fh, my $buf, 3);
# doesn't respect the encoding; now warnssysread($fh, my $buf, 3);
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
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[]
See perldelta (perl5240delta)
for other changes
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)
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
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
${^ENCODING} has been removed
× use encoding 'cp932';○ use encoding 'cp932', Filter => 1;
Good old Here-documents
{ my ($key, $value) = qw/foo bar/; my $json_template = << "END";{"$key": "$value"}END}
Indented Here-documents
{ my ($key, $value) = qw/foo bar/; my $json_template = <<~ "END"; {"$key": "$value"} END}
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.
See perl525[1-9]delta for other
changes
Changes in the Community
• Karen Pauley stepped down as TPF President
• Perl 5 Pumpking: Ricardo Signes to Sawyer X
• YAPC to The Perl Conferences2017.06.18-23 (Alexandria, Virginia, USA)2017.08.09-11 (Amsterdam, Netherlands)
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
CPAN Status
• 12915 PAUSE IDs (JP: 601)• 34607 Distributions
As of Dec 10, 2016
CPAN Status
As of Dec 10, 2016
Number of releasesYear Worldwide Japanese2012 22647 18582013 25760 32252014 27269 19372015 22999 11082016 18898 731
CPAN Status
As of Dec 10, 2016
Number of released distributionsYear Worldwide Japanese
2012 6777 5392013 7442 8042014 7586 5662015 6823 4072016 5957 306
CPAN Status
As of Dec 10, 2016
Number of new distributionsYear Worldwide Japanese2012 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%)
CPAN Status
As of Dec 10, 2016
Number of authors who releasedYear Worldwide Japanese
2012 1758 1232013 1803 1502014 1716 1302015 1553 1152016 1371 95
CPAN Status
As of Dec 10, 2016
Number of authors who released something new
Year Worldwide Japanese2012 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%)
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
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
Perl 6 in 2016
THE Christmas has come!
... as Larry announced last year.
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".
$ perl6 -vThis is Rakudo version 2016.11 built on MoarVM version 2016.11implementing 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
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)
However, Rakudo is fairly STABLE
now... as long as you use the
tested features.
README for ROAST 6.c says:
Any tests that contain a "use experimental" are not consideredpart of the specification, and their behavior is subject tochange. Anything not explicitly tested here is experimental.https://github.com/perl6/roast/blob/6.c/README#L8-L10
See the ROAST 6.c when in
doubt• Design docs explain goals;
not the current status.• 6.c-errata
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
According to a benchmark:
https://twitter.com/zoffix/status/796810512986238978
On other backends
Rakudo on JVM
• not included in Rakudo Star distributions now
• much slower than Rakudo on MoarVM but improving
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
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/
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_guide_automated.md
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/
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
Unicode support
say 「こんにちはこんにちは」 ; # 半角
「 」のみ
my $ 税率 = 1.08; ($ 金額 ×$ 税
率 ).say; say 100² ÷ ⅕; # 50000;say 100 ** 2 / unival("\x[2155]");
TWEAK submethodConsider 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
TWEAK submethodYou 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
TWEAK submethoduse 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
Lexical module loadnot merged yet; this will break
modules that depend on old, Perl5-like behavior.
# A.pm6class A {}
# B.pm6use A;class B {}
# test_lexical_module_load.pl6use B;A.new; # should die because A is not used here
Perl 6 Ecosystem~750 modules as of 2016/12
https://modules.perl6.org/
Perl 6 EcosystemDon'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 => {}});
PSIXDISTSPerl5 toolchain ignores distribution under PAUSE_ID/Perl6/ directory.
http://cpan.metacpan.org/authors/id/P/PS/PSIXDISTS/Perl6/
Writing a Perl 6 module
$ panda install App::Mi6$ mi6 new Your::Great::Module
Learning Perl 6• Perl 6 Advent Calendars
https://perl6advent.wordpress.com/See also tests under roast/integration/http://qiita.com/advent-calendar/2016/perl6http://qiita.com/advent-calendar/2015/perl6
• Perl 6 Introduction: http://ja.perl6intro.com• RosettaCode
https://rosettacode.org/wiki/Category:Perl_6• roast• perl6.org
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
Further Information• Weekly changes in and around Perl
6https://p6weekly.wordpress.com
• English videos about Perl 6 on YouTubehttp://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_versions.md
Thank you