2016年のperl (long version)

67
2016 年年 Perl (Long version) Kenichi Ishigaki @charsbar YAPC::Hokkaido 2016 Dec 10, 2016

Upload: charsbar

Post on 09-Jan-2017

486 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 2016年のPerl (Long version)

2016 年の Perl(Long version)

Kenichi Ishigaki@charsbar

YAPC::Hokkaido 2016Dec 10, 2016

Page 2: 2016年のPerl (Long version)

Perl 5 in 2016

Page 3: 2016年のPerl (Long version)

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

Page 4: 2016年のPerl (Long version)

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

Page 5: 2016年のPerl (Long version)

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

Page 6: 2016年のPerl (Long version)

auto-dereferencing

• push $arrayref //= [], $scalar;• for (keys $hashref) { ... }

• introduced in 5.14• experimental since 5.18

Page 7: 2016年のPerl (Long version)

auto-dereferencing is gone

× push $blessed_arrayref, $scalar;× for (keys $blessed_hashref) { ... }× print "interpolates $arrayref";

Page 8: 2016年のPerl (Long version)

• push $arrayref->@*, $scalar;• push $blessed_arrayref->@*, $scalar;• print "interpolates $arrayref->@*";

• experimental since 5.20

postderef is no longer experimental

Page 9: 2016年のPerl (Long version)

postderef is no longer experimental

△ $undef->%* # warning× $maybe_undef->%* // {}○ ($maybe_undef // {})->%*× keys ($maybe_hashref // {})->%*○ keys (($maybe_hashref // {})->%*)○ keys %{$maybe_hashref // {}} # shorter...

Page 10: 2016年のPerl (Long version)

Unicode 8.0

plackup -MEncode -e 'use 5.024; sub {[ 200, ["Content-Type" => "text/plain"], [encode_utf8("\N{TACO} \N{POPCORN}")],]}'

Page 11: 2016年のPerl (Long version)

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}" )],]}'

Page 12: 2016年のPerl (Long version)

Lexical $_ has been removed

• for my $_ (...) { ... }• implicitly used in given/when ( ~

5.16)• has been experimental since 5.18.• See perl5180delta for details

Page 13: 2016年のPerl (Long version)

/\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

Page 14: 2016年のPerl (Long version)

Nested declarations are not disallowed

my ($x, my($y)); # croaks now our (my $x); # ditto

Page 15: 2016年のPerl (Long version)

chdir(undef) no longer chdirs home

chdir(undef) or die "since 5.24";# but with no warning

Page 16: 2016年のPerl (Long version)

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

Page 17: 2016年のPerl (Long version)

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

Page 18: 2016年のPerl (Long version)

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[]

Page 19: 2016年のPerl (Long version)

See perldelta (perl5240delta)

for other changes

Page 20: 2016年のPerl (Long version)

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)

Page 21: 2016年のPerl (Long version)

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

Page 22: 2016年のPerl (Long version)

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

Page 23: 2016年のPerl (Long version)

${^ENCODING} has been removed

× use encoding 'cp932';○ use encoding 'cp932', Filter => 1;

Page 24: 2016年のPerl (Long version)

Good old Here-documents

{ my ($key, $value) = qw/foo bar/; my $json_template = << "END";{"$key": "$value"}END}

Page 25: 2016年のPerl (Long version)

Indented Here-documents

{ my ($key, $value) = qw/foo bar/; my $json_template = <<~ "END"; {"$key": "$value"} END}

Page 26: 2016年のPerl (Long version)

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.

Page 27: 2016年のPerl (Long version)

See perl525[1-9]delta for other

changes

Page 28: 2016年のPerl (Long version)

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)

Page 29: 2016年のPerl (Long version)

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

Page 30: 2016年のPerl (Long version)

CPAN Status

• 12915 PAUSE IDs (JP: 601)• 34607 Distributions

As of Dec 10, 2016

Page 31: 2016年のPerl (Long version)

CPAN Status

As of Dec 10, 2016

Number of releasesYear Worldwide Japanese2012 22647 18582013 25760 32252014 27269 19372015 22999 11082016 18898 731

Page 32: 2016年のPerl (Long version)

CPAN Status

As of Dec 10, 2016

Number of released distributionsYear Worldwide Japanese

2012 6777 5392013 7442 8042014 7586 5662015 6823 4072016 5957 306

Page 33: 2016年のPerl (Long version)

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%)

Page 34: 2016年のPerl (Long version)

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

Page 35: 2016年のPerl (Long version)

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%)

Page 36: 2016年のPerl (Long version)

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

Page 37: 2016年のPerl (Long version)

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

Page 38: 2016年のPerl (Long version)

Perl 6 in 2016

Page 39: 2016年のPerl (Long version)

THE Christmas has come!

... as Larry announced last year.

Page 40: 2016年のPerl (Long version)

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".

Page 41: 2016年のPerl (Long version)

$ 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

Page 42: 2016年のPerl (Long version)

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)

Page 43: 2016年のPerl (Long version)

However, Rakudo is fairly STABLE

now... as long as you use the

tested features.

Page 44: 2016年のPerl (Long version)

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

Page 45: 2016年のPerl (Long version)

See the ROAST 6.c when in

doubt• Design docs explain goals;

not the current status.• 6.c-errata

Page 46: 2016年のPerl (Long version)

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

Page 47: 2016年のPerl (Long version)

According to a benchmark:

https://twitter.com/zoffix/status/796810512986238978

Page 48: 2016年のPerl (Long version)

On other backends

Page 49: 2016年のPerl (Long version)

Rakudo on JVM

• not included in Rakudo Star distributions now

• much slower than Rakudo on MoarVM but improving

Page 50: 2016年のPerl (Long version)

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

Page 51: 2016年のPerl (Long version)

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/

Page 52: 2016年のPerl (Long version)

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

Page 53: 2016年のPerl (Long version)

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/

Page 54: 2016年のPerl (Long version)

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

Page 55: 2016年のPerl (Long version)

Unicode support

say 「こんにちはこんにちは」 ; # 半角

「 」のみ

my $ 税率 = 1.08; ($ 金額 ×$ 税

率 ).say; say 100² ÷ ⅕; # 50000;say 100 ** 2 / unival("\x[2155]");

Page 56: 2016年のPerl (Long version)

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

Page 57: 2016年のPerl (Long version)

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

Page 58: 2016年のPerl (Long version)

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

Page 59: 2016年のPerl (Long version)

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

Page 60: 2016年のPerl (Long version)

Perl 6 Ecosystem~750 modules as of 2016/12

https://modules.perl6.org/

Page 61: 2016年のPerl (Long version)

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 => {}});

Page 62: 2016年のPerl (Long version)

PSIXDISTSPerl5 toolchain ignores distribution under PAUSE_ID/Perl6/ directory.

http://cpan.metacpan.org/authors/id/P/PS/PSIXDISTS/Perl6/

Page 63: 2016年のPerl (Long version)

Writing a Perl 6 module

$ panda install App::Mi6$ mi6 new Your::Great::Module

Page 64: 2016年のPerl (Long version)

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

Page 65: 2016年のPerl (Long version)

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

Page 66: 2016年のPerl (Long version)

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

Page 67: 2016年のPerl (Long version)

Thank you