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

2025年秋のPerl

Avatar for Kenichi Ishigaki Kenichi Ishigaki
November 14, 2025
77

 2025年秋のPerl

YAPC::Fukuoka 2025

Avatar for Kenichi Ishigaki

Kenichi Ishigaki

November 14, 2025
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 2024年冬のPerl@YAPC::Hiroshima 2024年秋のPerl@YAPC::Hakodate 2025年秋のPerl@YAPC::Fukuoka <- イマココ
  2. Perl Toolchain Summit 2025 • 5月1日~5月4日 • 今年はライプツィヒで開催 • Japan

    Perl Association が 今年もスポンサーに (ありがとうございます) https://charsbar.hatenadiary.org/entry/2025/06/15/201905
  3. MST Matt S. Trout 氏が42歳の若さで亡くなりました • DBIx::Class • Moo •

    Role::Tiny • Devel::Declare • local::lib • strictures • JSON::MaybeXS
  4. CORE::chdir chdirをCORE付きで呼び出せるようになりました use experimental 'class'; class MyClass { method chdir

    { my $path = shift; &CORE::chdir($path) or return; say STDERR "CHDIR TO $path"; } }
  5. source::encoding __DATA__ や __END__ 以降は OK ですが… use v5.42; #

    ASCII ONLY __END__ =pod NAME 取扱説明書 # OK =cut
  6. アポストロフィとパッケージ 特定のスコープでのみ有効にすることもできます use v5.42; use Test::More; subtest 'Foo' => sub

    { use feature 'apostrophe_as_package_separator'; isn't $x => $y; # いまは isnt で }; done_testing;
  7. スマートマッチ 十年以上も警告無しには使えず、削除予定でした use v5.18; use experimental qw(smartmatch switch); say $foo

    ~~ $bar; given ($foo) { when (undef) { say '$foo is undefined' } default { say '$foo is something else' } }
  8. スマートマッチ ただし、use v5.42 (以降)だけでは使えません use v5.42; say $foo ~~ $bar;

    # エラー given ($foo) { # エラー when (undef) { say '$foo is undefined' } default { say '$foo is something else' } }
  9. スマートマッチ どうしても必要なら明示的に許可してください use v5.42; use feature qw(smartmatch switch); say $foo

    ~~ $bar; given ($foo) { when (undef) { say '$foo is undefined' } default { say '$foo is something else' } }
  10. any / all 演算子 効率を気にしなければ grep を使えばよいのですが… use Test::More; #

    どれかひとつでも定義されていればOK ok grep {defined $_} @foo; # すべて定義されていればOK ok !grep {!defined $_} @foo; done_testing;
  11. any / all 演算子 従来は List::Util が定番 use Test::More; use

    List::Util qw(any all); # または List::MoreUtils qw(any all) ok any {defined $_} @foo; ok all {defined $_} @foo; done_testing;
  12. any / all 演算子 5.42で実験的なキーワードが用意されました use v5.42; use Test::More; use

    experimental qw(keyword_any keyword_all); ok any {defined $_} @foo; ok all {defined $_} @foo; done_testing;
  13. any / all 演算子 any は List::Util より高速です use v5.42;

    use experimental qw(keyword_any); use List::Util; use Benchmark qw(cmpthese); my @foo = (1..100000); cmpthese(10000, { grep => sub { grep {defined $_} @foo }, l_u => sub { List::Util::any {defined $_} @foo }, any => sub { any {defined $_} @foo }, }); Rate grep l_u any grep 300/s -- -81% -90% l_u 1565/s 422% -- -47% any 2941/s 881% 88% --
  14. any / all 演算子 all はまだ残念な感じ use v5.42; use experimental

    qw(keyword_all); use List::Util; use Benchmark qw(cmpthese); my @foo = (1..100000); cmpthese(10000, { grep => sub { !grep {!defined $_} @foo }, l_u => sub { List::Util::all {defined $_} @foo }, all => sub { all {defined $_} @foo }, }); Rate all grep l_u all 226/s -- -26% -38% grep 305/s 35% -- -17% l_u 365/s 62% 20% --
  15. ^^= 演算子 5.40 で追加された ^^ 演算子の落ち穂拾い # 5.40 if ($x

    ^^ $y) { ... } if ($x xor $y) { ... } $x ^^ $y and return; # 5.42 $x ^^= $y;
  16. 新しい警告 自動で読み替えてくれたりはしません unless ($x =~ /^¥d+$/) { ... } #

    条件を追加しようとして事故ってしまう if (!$x =~ /^¥d+$/ && $x < 65536) { ... } # どちら? (意味的には後者でしょうが…) if (!($x =~ /^¥d+$/) && $x < 65536) { ... } if (!($x =~ /^¥d+$/ && $x < 65536)) { ... }
  17. :writer :reader属性は5.40でコア入りしました use v5.40; use experimental qw(class); class Author {

    field $name :param :reader; } my $author = Author->new(name => 'me'); say $author->name;
  18. :writer 5.42で :writer 属性もコア入りしました use v5.42; use experimental qw(class); class

    Author { field $name :param :reader :writer; } my $author = Author->new(name => 'me'); $author->set_name('Ishigaki'); say $author->name;
  19. :writer メソッドチェーンにも対応しています use v5.42; use experimental qw(class); class Point {

    field $x :param :reader :writer; field $y :param :reader :writer; } my $point = Point->new(x => 10, y => 10); $point->set_x(20)->set_y(20);
  20. :writer 必要ならメソッド名を変更できます use v5.42; use experimental qw(class); class Author {

    field $name :param :reader :writer(change_name); } my $author = Author->new(name => 'me'); $author->change_name('Ishigaki'); say $author->name;
  21. :writer ただし、readerと同じメソッド名にはできません use v5.42; use experimental qw(class); class Author {

    # Method name redefined が発生します field $name :param :reader :writer(name); } my $author = Author->new(name => 'me'); $author->name('Ishigaki'); # Too few arguments for subroutine ×say $author->name;
  22. :writer いまはまだスカラーのみの対応です use v5.42; use experimental qw(class); class Author {

    field $name :param :reader :writer; field @modules ×:param :reader ×:writer; method set_modules(@new) { @modules = @new } }
  23. プライベートメソッド 名前をつければ解決? package Foo; use Sub::Util qw(subname); sub do_something {

    my $self = shift; my $error_check = subname error_check => sub { ... }; ... $error_check->(@_); }
  24. プライベートメソッド 5.18 からはレキシカルサブルーチンで package Foo; use v5.18; use experimental 'lexical_sub';

    # 5.26まで sub do_something { my $self = shift; my sub error_check { ... }; ... error_check(@_); }
  25. プライベートメソッド ただし、微妙な制約もありました package Foo; use v5.26; my sub error_check {

    ... } sub do_something { my $self = shift; ... ×$self->error_check(@_); ◦error_check($self, @_); }
  26. プライベートメソッド 5.42 で method にも my を適用できるように use v5.42; use

    experimental 'class'; class Foo { my method error_check { ... } }
  27. プライベートメソッド 呼び出すときは ->& で use v5.42; use experimental 'class'; class

    Foo { my method error_check { ... } method do_something { ... $self->&error_check(@_); } }
  28. プライベートメソッド ->& は my sub にも適用できます package Foo; use v5.42;

    my sub error_check { ... } sub do_something { my $self = shift; ... $self->&error_check(@_); }
  29. エラー時に表示される method 引数の数 (5.43.2) 従来は暗黙の $self を抜いた数が表示されていました use v5.42; use

    experimental 'class'; class Foo { method bar ($x, $y) { ... } } my $foo = Foo->new; $foo->bar; # Too few arguments for subroutine 'Foo::bar' (got 0; expected 2)
  30. エラー時に表示される method 引数の数 (5.43.2) 5.43.2からは暗黙の $self を含んだ数になります use v5.43.2; use

    experimental 'class'; class Foo { method bar ($x, $y) { ... } } my $foo = Foo->new; $foo->bar; # Too few arguments for subroutine 'Foo::bar' (got 1; expected 3)
  31. Signatures Named Parameters 次の開発版で入る予定 # 従来の方法 sub f ($x, $y,

    $z = 123) { ... } f(1, 2, 123); # 新しい方法 sub f (:$x, :$y, :$z = 123) { ... } f(x => 1, y => 2, z => 123);
  32. Perl 4x • Perl 6 はもういません (Raku という「別言語」になりました) • 外の人にも

    Perl が進化を続けていることを伝えたい • Perl 7という話もありましたが… • 5 を落とすという選択肢もあるのではないか
  33. この先の主要Perl関連イベント • London Perl Workshop 2025 (Nov. 29, 2025) •

    Perl Community Conference (Dec. 17-18, 2025) • German Perl/Raku Workshop 2026 (Mar. 16-18, 2026) • Perl Toolchain Summit 2026? • The Perl and Raku Conference 2026?