2016年のPerl (Long version)

Preview:

Citation preview

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

Recommended