この記事は、Perl Advent Calendar 2025 24日目の記事です。 23日目は@shogo82148で「Perlクラスのレキシカルメソッドを試してみる」でした。
背景 ネタが尽きてきたので、引き続きperldeltaから頑張ってネタを探すシリーズをやっていこうと思います。
Perl 5.42 では警告にもいくつかの変更がありました。 そのうちよく引っかかりそうなものについて見ていきましょう。
否定演算子の優先順位に関する警告 たとえば以下のようなコードを考えてみましょう。
use v5.42; my $x = 5; my $y = 10; if (!$x < $y) { # バグ! (!$x) < $y を解釈される print "$x is not less than $y\n"; } else { print "$x is less than $y\n"; } 実行すると「5 is not less than 10」という誤った結果を返します:
Possible precedence problem between ! and numeric lt (<) at ./test.pl line 5.
この記事は、Perl Advent Calendar 2025 23日目の記事です。 22日目は@shogo82148で「Perlのフィールド変数の:writer属性を試してみる」でした。
背景 ネタが尽きてきたので、引き続きperldeltaから頑張ってネタを探すシリーズをやっていこうと思います。
クラスにレキシカルメソッドが実装されたらしいので、これを試してみます。
レキシカルメソッドの使い方 perlclass からの例です。 class機能はまだ実験的な機能扱いなので、機能の有効化と、警告の無効化が必要なことに注意してください。
use v5.42; use utf8; use feature 'class'; no warnings 'experimental::class'; class LexicalMethod { my method abc ($x, $y) { say "Internal method abc invoked with x=$x y=$y"; } method xyz { $self->&abc("x", "y"); } } my $obj = LexicalMethod->new(); $obj->xyz(); # エラーになる例: $obj->abc("hello", "world"); 実行すると以下のような結果が得られます:
Internal method abc invoked with x=x y=y Can't locate object method "abc" via package "LexicalMethod" at .
この記事は、Perl Advent Calendar 2025 22日目の記事です。 21日目は@hkobaで「Rust の libperl-sys で XS を書いてみた」でした。
背景 ネタが尽きてきたので、perldeltaから頑張ってネタを探すシリーズをやっていこうと思います。
クラスのフィールド変数に :writer 属性というのが追加されたらしいので、今回はそれを試してみます。
:writer 属性の使い方 perldelta からの例です。 class機能はまだ実験的な機能扱いなので、機能の有効化と、警告の無効化が必要なことに注意してください。
use v5.42; use feature 'class'; no warnings 'experimental::class'; class Point { field $x :reader :writer :param; field $y :reader :writer :param; } my $p = Point->new( x => 20, y => 40 ); $p->set_x(60); say "x: ", $p->x; # 60 say "y: ", $p->y; # 40 :writer 属性を使うと変数 x に対して set_x というメソッドが生えてきます。 これを使って変数 x の値を変更することが可能です。
この記事は、Perl Advent Calendar 2025 16日目の記事です。 15日目は@mackee_wで「YAPC::Fukuoka 2025非公式リジェクトコンを開催しました」でした。
背景 2025 年 11 月 30 日、AWS Lambda マネージドインスタンスが発表されました。
AWS Lambda マネージドインスタンスのご紹介:サーバーレスの簡単さと EC2 の柔軟性 AWS Lambda 関数をEC2上で実行できるようにするサービスです。 楽しそうですね。AWS::Lambdaでもサポートしてみました。
実装 現時点でのドキュメントには残念ながらカスタムランタイムのサポートはありません。
Lambda Managed Instances runtimes ただし、カスタムランタイムのサポート予定はあるみたい?Goのランタイムでは対応が進んでます。
Add support for AWS_LAMBDA_MAX_CONCURRENCY aws/aws-lambda-go#600 これを参考に実装を進めました。
Add support for AWS_LAMBDA_MAX_CONCURRENCY shogo82148/p5-aws-lambda#204 Perlランタイムの並行制御 DefaultのAWS Lambda実行環境では、ひとつ実行環境に対して一度にひとつのタスクが割り当てられます。 それに対して、マネージドインスタンスではひとつの実行環境に一度に複数のタスクが割り当てられ、各タスクは並行処理されます。ランタイムによってタスクの並行処理のやり方が異なるため、注意が必要です。
AWS::Lambdaの場合はプロセスによってタスクの並行処理を行います。
まとめ AWS::Lambda でAWS Lambda マネージドインスタンスのサポートを行いました。 ぜひ試してみてください!
明日17日は@ijookidさんで『perlが「オワコン」扱いされるに至った本当の理由とは?』です。
🐰 新記事跳ねて、ランタイム道しるべ、
Perl と Lambda、手を取り進む、
ドキュメントの畦(あぜ)に一輪咲き、
読む者よ知恵を拾い行け、
軽やかに、未来へぴょん。
by CodeRabbit
参考 AWS::Lambda AWS Lambda マネージドインスタンスのご紹介:サーバーレスの簡単さと EC2 の柔軟性 Add support for AWS_LAMBDA_MAX_CONCURRENCY aws/aws-lambda-go#600 Add support for AWS_LAMBDA_MAX_CONCURRENCY shogo82148/p5-aws-lambda#204
この記事は、Perl Advent Calendar 2025 13日目の記事です。 12日目は@takihitoで「10年ぶりCPANリリース&爆破解体の裏話」でした。
背景 アドベントカレンダーのネタを探しインターネットの海を彷徨っていたところ、 fglock/PerlOnJavaというプロジェクトを見つけました。 なんと、Javaで実装されたPerlのインタープリターです!! これは熱い!!!
試してみた 今のところビルド済みのバイナリーは提供されていないようなので、 自前でビルドしてあげる必要があります。
macOS上で試してみました。 Javaの開発環境が必要なので、brewを使ってインストールしておきます。
brew install gradle PATH=$(brew --prefix openjdk)/bin:$PATH あとはcloneしてmakeしてあげるだけです。
git clone git@github.com:fglock/PerlOnJava.git cd PerlOnJava make jperl というスクリプト経由でPerlを実行できるようになります。
./jperl -E 'say "Hello World"' う、動いたああああーーーー!!!!
ベンチマーク JVM上で実行されていることもあって、やはり性能が気になりますよね。 竹内関数 を使ってベンチマークを取ってみました。
use v5.42; use strict; use warnings; use Benchmark qw(timethis); sub tarai($x, $y, $z) { return $y if $x <= $y; tarai( tarai($x-1, $y, $z), tarai($y-1, $z, $x), tarai($z-1, $x, $y)); } timethis(10, sub { tarai(12, 6, 0) }); まずは普通のPerlから。
この記事は、Perl Advent Calendar 2025 11日目の記事です。 10日目は@shogo82148で「Perl 5.43.5 の Signatures Named Parameters を先取り」でした。
背景・目的 Perl 5.42.0 から any と all キーワードが使えるようになったそうです。 まだ実験的機能ですが遊んでみます。
試してみた まずは all キーワードから試してみます。 まだ実験的機能扱いなので、明示的に機能を有効化することと、警告を無効化することが必要です。
use v5.42; use feature 'keyword_all'; no warnings 'experimental::keyword_all'; my @numbers = (2, 4, 8, 16); if ( all { $_ % 2 == 0 } @numbers ) { say "All the numbers are even"; } 出力:
All the numbers are even (2, 4, 8, 16) はすべて偶数なので、意図した結果が得られました。
TL;DR Go 1.25 から正式サポートされたtesting/synctestパッケージを使ってみた 「synctest.Run not supported with asynctimerchan」というメッセージとともにpanicした go mod edit -go=1.23 を実行すれば解決 背景 shogo82148/go-retry は指数的バックオフをよしなになってくれるライブラリーです。
shogo82148/go-retry Goで指数的バックオフをやってくれるgo-retryを書いた go-retry v1.2.0 リリースのお知らせ、ジェネリクスがやってきた go-retry v2 リリースのお知らせ は待ち時間を調整するテストを書くために、「実際にSleepをして経過時間を取得する」という方法を採用しています。
// テストのイメージ func Test(t *testing.T) { var policy = retry.Policy{ MinDelay: 100 * time.Millisecond, MaxDelay: time.Second, MaxCount: 3, } // 実際にSleepをして経過時間を取得する start := time.Now() _ = policy.Do(t.Context(), func() error { return errors.New("some error") }) d := time.Since(start) if d < 300*time.Millisecond { t.Errorf("want at least 300ms, got %s", d) } } このテストは実際に300ミリ秒Sleepしてしまうので、テストに必ず300ミリ秒かかってしまいます。 また実際のSleep時間はランタイムの状態によって変化してしまうため、 「300ミリ秒ちょうどSleepする」ことをテストしたいのに、実際にそのようなテストを書くことは難しいです。
この記事は、Perl Advent Calendar 2025 10日目の記事です。 9日目は@sognmuで「Text::Markdown::Discountのメンテナンスを引き継ぎました」でした。
背景 2025年12月10日時点の最新版のPerl 5.43.5(開発版)で、 サブルーチンの名前付きパラメーター呼び出し(Signatures Named Parameters)がサポートされました。 これは PPC0024 を実装したものです。
どういう機能かさっそく遊んでみましょう。
Perl 5.43.5 のビルド Signatures Named Parameters はまだ安定版のPerlには取り込まれていません。 使用するには開発版のPerlをビルドする必要があります。
plenv install 5.43.5 -Dusedevel plenv local 5.43.5 試してみる ビルドが完了したら実際に試してみましょう。
まだ実験的な(Experimental)機能という位置づけなので、今回検証した挙動は将来変更される可能性があります。 注意してください。
普通に呼び出し サブルーチンの仮引数部に :$alpha と書くと名前付きパラメーターとして扱われます。 サブルーチンの中からは $alpha という変数名でアクセス可能です。 呼び出し側からは alpha => "A" のように指定します。
use v5.43.5; use experimental qw(signature_named_parameters); sub foo (:$alpha, :$beta) { print "The value of alpha was $alpha\n"; print "The value of beta was $beta\n"; } foo(alpha => "A", beta => "B"); 出力:
この記事は、Perl Advent Calendar 2025 4日目の記事です。 3日目はid:hkoba501で「Claude Code は OO Modulino (オゥオゥ・モジュリーノ)も理解してくれる、ぽい!」でした。
YAPC::Fukuoka 2025 の余興でコードゴルフコンテストが開催されました。
コードゴルフコンテスト Anybatross YAPC::Fukuoka 2025 開催のお知らせ PerlAnybatross YAPC::Fukuoka 2025 コードゴルフとは、与えられた仕様に対してできる限り短いソースコードで解答するというゲームです。 今回はPerl、Ruby、Python、JavaScript、PHPなどで参加可能ですが、Perl Advent Calendarのネタのために、 個人的に一番馴染み深いPerlを使って参加しました。 結果、すべての問題をPerlでチャレンジした人の中では2位になることができました。
Hole 1 アルファベットのAやBにあるような、文字の中にある閉じた空間のことをカウンターといいます。
0〜9までの10種と、アルファベット大文字のA〜Zの26種、合計36種の文字やその他の記号を利用した文字列が渡されるので、カウンターの数を数えてください。アルファベット小文字は来ません。その他の記号のカウンターは数えなくてよいです。
1行ずつ数えて、その行までの累積個数と、その行での出現個数を出力してください。
https://perlbatross.kayac.com/contest/2025fukuoka/challenge/1/sample サンプルのコードが提供されているので、まずはここから始めていきましょう。
Score: +1065
use v5.40; use utf8; our $COUNTER_MAP = { '0' => 1, '1' => 0, '2' => 0, '3' => 0, '4' => 1, '5' => 0, '6' => 1, '7' => 0, '8' => 2, '9' => 1, 'A' => 1, 'B' => 2, 'C' => 0, 'D' => 1, 'E' => 0, 'F' => 0, 'G' => 0, 'H' => 0, 'I' => 0, 'J' => 0, 'K' => 0, 'L' => 0, 'M' => 0, 'N' => 0, 'O' => 1, 'P' => 1, 'Q' => 1, 'R' => 1, 'S' => 0, 'T' => 0, 'U' => 0, 'V' => 0, 'W' => 0, 'X' => 0, 'Y' => 0, 'Z' => 0, }; my $input = do { local $/; <STDIN> }; my @lines = split /\n/, $input; my @results; my $accumulated_count = 0; # 行ごとに処理する for my $line_num (0.
背景・目的 「マイナンバー.csvというファイルにチェックディジットの正しい12桁整数を大量に入れておくいたずらを考えた」という𝕏の発言を見て、
マイナンバーが保存された状態でコンピュータが故障したら修理にも出せない https://t.co/ZNK9KKtFkZ ので、絶対にメールでは送らないように言われたことがあったっけ。マイナンバー.csvというファイルにチェックディジットの正しい12桁整数を大量に入れておくいたずらを考えたけど実行してない
— Haruhiko Okumura (@h_okumura) November 3, 2025 そういえば、過去にマイナンバーの可能性のある数列をすべて列挙した人がいたよなーと思い出しました。 完全に二番煎じですが、自分でもやってみました。
前例 計算が終了 https://t.co/UivoSSaAJU pic.twitter.com/zm1ZznWWtA
— 弥生 水葉𝕏 (@yayoi_mizuha) November 25, 2024 マイナンバー一覧生成 C++よくわからずコンパイル通らなかったので、Goで再実装してみました。
shogo82148/go-generate-my-number package main import ( "bufio" "io" "os" ) func main() { w := bufio.NewWriterSize(os.Stdout, 1<<20) for i := range 100_000_000_000 { if err := checkDigit(w, i); err != nil { panic(err) } } if err := w.Flush(); err != nil { panic(err) } } func checkDigit(w io.