スキップしてメイン コンテンツに移動

投稿

7月, 2020の投稿を表示しています

去る6月に Perl 5.32.0 がリリースされたので差分を把握するために perldelta を読んだ件

要旨Perl 5 メジャーバージョンアップの季節がやって来たのでまともな Perl プログラマの嗜みとして perldelta を読んだ。今回は有り体に言えばルーティン的なリリースで、言語コアの拡張は他言語にも見られる構文が実験的に入ったくらいで大きな変化はない。新機能は RegExp の拡充が主である。比較的重要と思われる変更点を抜粋する。新機能isa 演算子実験的機能。Python とか Java における isinstance とか instanceof。これまでも UNIVERSAL::isa があったが、これはメソッドなのでレシーバにオブジェクトでもクラスでもない値 (i.e., 未定義値 / bless されていないリファレンス) を置くと実行時エラーが起きるのが問題だった:package Foo {use Moo;}package Bar {use Moo; extends 'Foo';}package Baz {use Moo;}use feature qw/say/;sub do_something_with_foo_or_return_undef {my ($foo) = @_;# Returns safely if the argument isn't an expected instance, in mind.returnunless$foo->isa('Foo'); ...;}# OK.do_something_with_foo(Bar->new);# |undef| is expected in mind, but actually error will be thrown.do_something_with_foo(undef); これを避けるために今までは Scalar::Util::blessed を併用したりしていたわけだが、isa 演算子は左辺が何であっても意味のある値を返すのでよりシンプルになる:# True+(bless +{} => 'Foo') isa Foo;# Falseundef isa Foo;# False+{} isa Foo;# False+(bless +{} => 'Baz') isa Foo; 比較演算子…