Masteries

技術的なことや仕事に関することを書いていきます.

Perl 5.35.7 の builtin を試してみる

この記事は, 「Perl Advent Calendar 2021」の22日目の記事です.

qiita.com

昨日はtecklさんの「Perlアプリケーション + AWS Lambda + API GatewayでWebhookを受ける」でした.

qiita.com

Perl 5.35.7 で builtin を試してみる

metacpan.org

Perl 5.36に向けた開発版の現時点での最新版, Perl 5.35.7 では, builtinというユーティリティを提供するプラグマが提供されています. 特に注目すべきはtrue, false, isboolの提供でしょう. ということで, 実際にインストールして試してみます.

shogo82148.github.io

を参考に, 次のように5.35.7をインストールします:

plenv install 5.35.7 -Dusedevel

さあ, 試してみましょう. まず, そもそも truefalseは何を返すのでしょうか?

use strict;
use warnings;
use builtin qw(true false);
use feature qw(say);

my $true = true;
my $false = false;

say "'$true' / '$false'"; # => '1' / ''

このように, true!!1ないし!0(This gives an equivalent value to expressions like !!1 or !0.), false!!0ないし!1(This gives an equivalent value to expressions like !!0 or !1.)と同値となる値が得られるようになっています. Perlで真偽値を扱う時に, !!1!!0はよく使いますが, Perlの入門者からすると「これは一体...?」となりがちでした. これをtrue/falseで表せるのは大変嬉しいですね.

一方で, true/falseをJSON::XSなどでJSONに変換する時は注意が必要です:

use strict;
use warnings;
use builtin qw(true false);
use feature qw(say);
use JSON::XS qw(encode_json);

my $true = true;
my $false = false;

say encode_json({ true => $true, false => $false }); # => {"true":"1","false":""}

JSON::XSでは(デフォルトでは), \1true, \0falseとなるように変換してくれます. このため, \1 !=0 !!1, \0 != !!0であるため, true"1"に, false""に変換されてしまいます.

use strict;
use warnings;
use feature qw(say);
use JSON::XS qw(encode_json);

say encode_json({ true => \1, false => \0 }); # => {"true":true,"false":false}

このシンプルな解決策としては, JSON::Typesのboolを使うといった作戦がありそうです.

use strict;
use warnings;
use builtin qw(true false);
use feature qw(say);
use JSON::XS qw(encode_json);
use JSON::Types qw(bool);

my $true = true;
my $false = false;

say encode_json({ true => bool $true, false => bool $false }); # => {"true":true,"false":false}

また, このbuiltinプラグマでは, これまでScalar::Util で提供されていた blessed や weakref などが提供されるのも若干嬉しいポイントですね. 加えて, 真偽値かどうかの判定に使える, is_boolなども提供されています.

感想としては, 前述した通り!!1!!0というPerlで真偽値を扱う時の「よくある(が見慣れない)表現」をtrue/falseで書けるようになるのは嬉しいですね. 一方で, JSONにencodeする時の扱いは引き続き気をつける必要がありそうです. この辺りもいい感じになれば, 更に便利! という感じがしそうです.

明日は...

id:hitode909 さんです. よろしくおねがいします.

お詫びと御礼

何を言っても言い訳になるのですが, 最近頭痛が激しくて少し軽めの記事になってしまいました... 申し訳ありません. 元気になったらもうちょっと加筆します.

また, builtin の登場は会社のSlackで id:nanto_vi さんに教えてもらいました. この場を借りて御礼申し上げます.