この記事は, 「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 さんに教えてもらいました. この場を借りて御礼申し上げます.