12. 正規表現中の
「 C 」文字クラ
スは削除文字列の内部表現を変更できたりするので 5.20 で廃止
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; # い
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; # い
13. :utf8 レイヤ付きハンドルへの
sysread()/syswrite() は廃止
これも同じく文字列境界を無視してしまうので
use strict;
use warnings;
open my $fh, '<:encoding(cp932)', 'test.txt';
# こちらは正しく「文字単位」
read($fh, my $buf, 3);
# こちらは「文字単位」にならないので警告
sysread($fh, my $buf, 3);
use strict;
use warnings;
open my $fh, '<:encoding(cp932)', 'test.txt';
# こちらは正しく「文字単位」
read($fh, my $buf, 3);
# こちらは「文字単位」にならないので警告
sysread($fh, my $buf, 3);
23. 正規表現中の { の扱いが変更に
5.16 で廃止、 5.22 以降警告が出ていたのが死ぬように
$foo =~ /d{1,10}/; # ok
$foo =~ /d{1}/; # ok
$foo =~ /something{}/; # 5.26 ではエ
ラー
$foo =~ /something{/; # 5.26 ではエ
ラー
$foo =~ /something[{]/; # ok
$foo =~ /something{/; # ok
$foo =~ /d{1,10}/; # ok
$foo =~ /d{1}/; # ok
$foo =~ /something{}/; # 5.26 ではエ
ラー
$foo =~ /something{/; # 5.26 ではエ
ラー
$foo =~ /something[{]/; # ok
$foo =~ /something{/; # ok
$foo =~ /{}/; # これも ok
24. レキシカルサブルーチン
が正式化
5.18 で実験的に導入。詳しくは perldoc perlsub
{
sub whatever {
my $x = shift;
my sub inner {
... do something with $x ...
}
inner();
}
}
{
sub whatever {
my $x = shift;
my sub inner {
... do something with $x ...
}
inner();
}
}
25. ${^ENCODING} は削除
2015 年の YAPC で Yappo さんがおっしゃっていた通り
× use encoding 'cp932';
○ use encoding 'cp932', Filter => 1;
× use encoding 'cp932';
○ use encoding 'cp932', Filter => 1;
45. package Point {
use Moxie;
extends 'Moxie::Object';
has '$!x' => sub { 0 };
has '$!y' => sub { 0 };
sub BUILDARGS : init_args(
x => '$!x',
y => '$!y',
);
sub x : ro('$!x');
sub y : ro('$!y');
sub set_x : wo('$!x');
sub set_y : wo('$!y');
sub clear ($self) {
@{ $self }{'$!x', '$!y'} = (0, 0);
}
sub pack ($self) {
+{ x => $self->x, y => $self->y }
}
}
package Point {
use Moxie;
extends 'Moxie::Object';
has '$!x' => sub { 0 };
has '$!y' => sub { 0 };
sub BUILDARGS : init_args(
x => '$!x',
y => '$!y',
);
sub x : ro('$!x');
sub y : ro('$!y');
sub set_x : wo('$!x');
sub set_y : wo('$!y');
sub clear ($self) {
@{ $self }{'$!x', '$!y'} = (0, 0);
}
sub pack ($self) {
+{ x => $self->x, y => $self->y }
}
}
https://github.com/stevan/p5-Moxie/blob/master/t/000-samples/001-point.t
49. $ perl6 -v
This is Rakudo version 2017.02 built on MoarVM version 2017.02
implementing Perl 6.c.
This is Rakudo version 2017.02 built on MoarVM version 2017.02
implementing Perl 6.c.
• say $*PERL.version; # v6.c
• say $*PERL.name; # Perl 6
• say $*PERL.compiler.version; # v2017.02
• say $*PERL.compiler.name; # rakudo
• say $*VM.version; # v2017.02
• say $*VM.name; # moar
• say $*PERL.version; # v6.c
• say $*PERL.name; # Perl 6
• say $*PERL.compiler.version; # v2017.02
• say $*PERL.compiler.name; # rakudo
• say $*VM.version; # v2017.02
• say $*VM.name; # moar
use 文で制御できるのは v6.c の部分だけ
50. 最終的な目標をすべて達成できて
いるわけではありません
ROAST から切り出される各実装向けのテストにはいろい
ろと分岐なども残っています
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";
}
}
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)
57. TWEAK サブメソッ
ドPerl 6 の BUILD は Moose の BUILDARGS 相当
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
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
58. TWEAK サブメソッ
ド…こう書いてもよいのですが
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
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
59. TWEAK サブメソッ
ドMoose の BUILD 相当のものが新設されました
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
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
60. モジュールの読み込みが
レキシカルスコープに
A.pm6
use A;
class B {}
use A;
class B {}
use B;
A.new; # die since 2017.01
use B;
A.new; # die since 2017.01
• これによってアプリ内
で複数バージョンの同
じモジュールを利用す
ることができるように
• Rakudo のバージョンを
上げてもモジュールの
再インストールは不要
• rakudobrew で切り替え
るよりシステムにイン
ストールしてしまう方
class A {}class A {}
B.pm6
lexical_module_load.pl6
61. Unicode サポート
say 「こんにちはこんにちは」 ; # 半角「 」
のみ
my $ 税率 = 1.08; ($ 金額 ×$ 税率 ).say;
say 100² ÷ ⅕; # 50000;
say 100 ** 2 / unival("x[2155]");
say 「こんにちはこんにちは」 ; # 半角「 」
のみ
my $ 税率 = 1.08; ($ 金額 ×$ 税率 ).say;
say 100² ÷ ⅕; # 50000;
say 100 ** 2 / unival("x[2155]");