Perl 5.15.3 released!

ちょっと時間がたってますが、Perlの開発版である5.15.3がリリースされています。
cf. Perlのバージョン表記について

今回は大きな変更はないのですが、5.15.2で導入された組み込み関数のコードリファレンスの取得についての制限が緩和されています。具体的には、5.15.2では引数をとる組み込み関数をコードリファレンスから呼ぶことが出来ず、かならずコンパイル時に型グロブに代入してプロトタイプが効くようにしなければならなかったのですが、5.15.3からは引数を取る組み込み関数でもコードリファレンスを通じて呼ぶことができます。

#!perl
use 5.15.3;
use strict;
use warnings;

my $length = \&CORE::length;
say $length->('foo'); # -> 3

my $substr = \&CORE::substr;
say $substr->("bar", 1, 2); # -> ar
__END__

ただし完全に制限がなくなったわけではなく、each()やpush()など依然としてコードリファレンスを直接呼ぶことのできないものもあります。また、print()やgrep()などの特殊なプロトタイプをもつ関数*1はコードリファレンスを取ることも不可能です。
今回の変更で、XSから組み込み関数を呼びやすくなりました。従来はXSから組み込み関数を呼ぶことが非常に困難であり、やむをえずsub myuc{ uc($_[0]) }などというラッパーを作っていたところですが、これで余計なラッパーが必要なくなるからです。正規リリースが楽しみですね。

See perldelta.pod for details.

*1:つまりオーバーライド不能な組み込み関数