Upgrade to Pro — share decks privately, control downloads, hide ads and more …

perl_in_2023spring.pdf

Kenichi Ishigaki
March 20, 2023
440

 perl_in_2023spring.pdf

Kenichi Ishigaki

March 20, 2023
Tweet

Transcript

  1. me 2016年のPerl@LLoT Perl in 2016@YAPC::Hokkaido 2017年春のPerl@YAPC::Kansai 2017年夏のPerl@YAPC::Fukuoka (萬國之津梁@YAPC::Okinawa) (2018年初夏のPerl5)@Hokkaido.pm #14

    2018年夏のPerl5@Shibuya.pm #18 2018年残暑のPerl@LL2018 2019年冬のPerl@YAPC::Tokyo (Learn Languages 2021) 2023年春のPerl@YAPC::Kyoto <- イマココ
  2. Perl 6 • 正式に Raku に改名されました (2019年) • 安定版は 6.c

    (2015年) → 6.d (2020年) • 開発はいまも順調に続いているようです • 詳しくは Rakudo Weekly News を (今回はこれ以上取り上げません)
  3. パンプキンから運営委員会へ • 選考の手続きなどが明確に • 万一暴走したら止められるように • 不当な圧力からは守られるように • コアチーム: 2023年春時点では25名

    (+活動休止中 5名) • ドキュメントなどでの貢献者も含む • 最新のリストはGitHubで確認 https://github.com/Perl/perl5/blob/blead/pod/perlgov.pod
  4. C/XS に堪能な開発者が (偶然にも)意思決定の場に復帰 Paul Evans • Syntax::Keyword::Try • Future::AsyncAwait •

    Object::Pad • Perl in 2025 (@FOSDEM, 2021) https://www.youtube.com/watch?v=raSRNIoUYig
  5. RFC 制度の導入 2023年春の時点で 19 件の RFC が登録 • 実装済み 6

    件 • 受理済み 3 件 • 草稿段階 8 件 (3 件は実装済みのはず) • 却下済み 2 件 • 登録待ち 1 件
  6. 5.30 (2019年) • 機能強化 9 件 • 正規表現関連 2 件

    • Unicode 関連 4 件 • 非互換変更 11 件 • 廃止済みの機能の致死化 7 件 • 機能廃止 1 件 • モジュール削除 2 件
  7. 5.32 (2020年) • セキュリティ修正 3 件 • 機能強化 11 件

    • 実験的機能追加 1 件 • 実験的機能(正規表現)の昇格 2 件 • Unicode 関連 3 件 • 非互換変更 10 件 • モジュール削除 1 件
  8. 5.36 (2022年) • 機能強化 13 件 • 実験的機能追加 6 件

    • 実験的機能の昇格 4 件 • 非互換変更 1 件 • 機能廃止 1 件 • 新規関数 13 件
  9. 5.37.* (2022~2023年) • 機能強化 9 件 • 実験的機能追加 1 件

    • 非互換変更 5 件 • 機能廃止 2 件 • 新規関数 2 件 • 新規プラグマ 1 件
  10. try/catch/finally (5.36) Syntax::Keyword::Try の typed catch には未対応 use v5.36; use

    Syntax::Keyword::Try qw(try :experimental(typed)); try { ... } catch($e isa Class) { ... } catch($e =~ /Undefined/) { ... } finally { ... }
  11. defer (5.36) スコープを抜けるときに実行する処理を 定義しておけるようになりました use experimental qw(defer); use File::Path; {

    mkdir $tmpdir; defer { # エラー死しても実行されます File::Path::remove_tree($tmpdir, { safe => 1 }); } ... }
  12. use v5.36; で無効になる機能 • use v5.36; によって use warnings; 相当の機能なども

    有効になります • use v5.36; によって無効になる機能もあります (5.36 で強制的に無効になる機能ではありません) • あえて使うときは use feature ... してください
  13. use v5.36; で無効になる機能 メソッドの間接呼び出し use v5.36; use IO::File; my $fh

    = new IO::File; # 5.32 以降 no feature 'indirect'; use IO::File; my $fh = new IO::File;
  14. use v5.36; で無効になる機能 多次元ハッシュキー use v5.36; $foo{$x, $y}; # 5.34

    以降 no feature 'multidimentional'; $foo{$x, $y}; # 5.34 以前 no multidimentional; $foo{$x, $y};
  15. use v5.36; で無効になる機能 given/when 文 use v5.36; # use feature

    qw(switch); # use experimental qw(smartmatch); given ($flag) { when ("foo") { ... } when ("bar") { ... } }
  16. ループで複数の値を同時に取り出す (5.36) use experimental qw(for_list); for my ($key, $value) (%hash)

    { # 取り出し順は不定 ... } for my ($name, $version, $path) (@array) { ... }
  17. ループで複数の値を同時に取り出す (5.36) use experimental qw(for_list builtin); use builtin qw(indexed); for

    my ($i, $value) (indexed @array) { ... } 添字と値を同時に… for my $i (0 .. $#array) { my $value = $array[$i]; ... }
  18. builtin::true, builtin::false (5.36) JSON::PP::Boolean を真偽値に使うのには抵抗 がある、という人には朗報になるかも use experimental qw(builtin); use

    JSON::PP 4.11 (); say JSON::PP::encode_json({ true => builtin::true, false => builtin::false, }); # {"true":true,"false":false}
  19. builtin::true, builtin::false (5.36) CPAN モジュールのサポートはまだまだ限定的 use experimental qw(builtin); use JSON::XS

    (); say JSON::XS::encode_json({ true => builtin::true, false => builtin::false, }); # {"true":"1","false":""} use experimental qw(builtin); use Cpanel::JSON::XS (); say Cpanel::JSON::XS::encode_json({ true => builtin::true, false => builtin::false, }); # {"true":1,"false":""}
  20. builtin::is_weak (5.36), builtin::is_tainted (5.37.2) たまに名前が異なるものがあるので要注意 use experimental qw(builtin); use Scalar::Util;

    if (builtin::is_weak($obj)) { ... } if (Scalar::Util::isweak($obj)) { ... } if (builtin::is_tainted($obj)) { ... } if (Scalar::Util::tainted($obj)) { ... }
  21. export_lexically (5.37.2) 特定のブロックのみにエクスポートできるモジュールを作成できます package My::Util; use v5.36; use experimental qw(builtin);

    sub import { my $class = shift; my %export = map { $_ => $class->can($_) // die "Can't export $_" } @_; builtin::export_locally %export; } sub foo { say "foo" } 1;
  22. export_lexically (5.37.2) builtin 関数も同じ性質を持っています { use Scalar::Util qw(reftype); say reftype($obj);

    } say reftype($obj); # OK { use builtin qw(reftype); say reftype($obj); } say reftype($obj); # NG
  23. class (5.37.9) Object::Pad の成果を受けて、Perl コアでも クラスの実装が始まっています use v5.37; use experimental

    'class'; class Person { field $name :param; method name { $name } method say_hi { say "Hi, I'm $name." } } use Person; my $p = Person->new( name => 'charsbar', ); $p->say_hi; # Hi, I’m charsbar.
  24. class (5.37.9) 継承は :isa 属性で use v5.37; use experimental 'class';

    class Author :isa(Person) { field $pause_id :param; method pause_id { $pause_id } } use Author; my $me = Author->new( name => 'charsbar', pause_id => 'ISHIGAKI', ); $me->say_hi; # Hi, I’m charsbar $me->pause_id # ISHIGAKI
  25. class (5.37.9) 親クラスの field 変数は見えません use v5.37; use experimental 'class';

    class Author :isa(Person) { ... method name_and_id { # × "$name ($pause_id)" $self->name . " ($pause_id)"; } }
  26. class (5.37.9) メソッドはシグネチャに対応しています use v5.37; use experimental 'class'; class Author

    :isa(Person) { ... method say_hi_to ($person = "there") { say "Hi, $person!"; } }
  27. class (5.37.9) CPAN に上げるなら当面は従来の package や $VERSION も併用した方が無難です use v5.37;

    use experimental 'class'; package Person; our $VERSION = '0.01'; class Person { ... }
  28. コアの変更に取り残されないように • blead の変更で CPAN モジュールに影響が出る ことがあります • 時にはコア開発者からパッチが届くことも •

    Dist::Zilla などのツールを使っている方は READMEにひとこと説明を • perl5377delta.pod には既知の問題として Test::Vars などの未対応が言及されています
  29. サポート下限 • ツールチェーンはまだ 5.8.1 • 今年の Toolchain Summit で議論になるかも •

    一部のモジュールは 5.12 くらいまで上がって きています • CentOS7 付属の Perl は 5.16
  30. 2023年の主要Perl関連イベント • Perl Toolchain Summit 2023 (4/27~4/30, Lyon, France) •

    The Perl and Raku Conference 2023 (6/11~13, Toronto, CA) https://tprc.to/tprc-2023-tor/ • The Raku Conference 2023 (8/3~4, Riga, Latvia) https://conf.raku.org • Perl and Koha Conference in helsinki 2023 (8/14~18, Helsinki, Finland) https://intro.perlkohacon.fi/