この記事は, 「Perl Advent Calendar 2021」の22日目の記事です.
昨日はtecklさんの「Perlアプリケーション + AWS Lambda + API GatewayでWebhookを受ける」でした.
Perl 5.35.7 で builtin を試してみる
Perl 5.36に向けた開発版の現時点での最新版, Perl 5.35.7 では, builtinというユーティリティを提供するプラグマが提供されています. 特に注目すべきはtrue, false, isboolの提供でしょう. ということで, 実際にインストールして試してみます.
を参考に, 次のように5.35.7をインストールします:
plenv install 5.35.7 -Dusedevel
さあ, 試してみましょう. まず, そもそも trueやfalseは何を返すのでしょうか?
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では(デフォルトでは), \1をtrue, \0をfalseとなるように変換してくれます. このため, \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 さんに教えてもらいました. この場を借りて御礼申し上げます.