Perl 5.36がリリース - warningsの有効化、サブルーチンシグネチャ、try-catch-finally文、Unicode 14サポート

Perl 5.36が2022年5月28日にリリースされました。warningsの有効化、サブルーチンシグネチャ、try-catch-finally文、Unicode 14サポート、ブール・文字列・数値を区別する関数の追加など機能強化が図られています。

Perl 5.36の機能を使う

Perl 5.36で提供されているすべての機能を使うには、バージョン宣言「use v5.36」をソースコードの先頭に記述します。

use v5.36;

バージョン宣言はソースコードの先頭で行ってください。そうしないと、予期しない動作が発生する可能性があります。

warningsの有効化

警告を発生させるwarningsモジュールが、バージョン宣言によって有効になります。

use warnings;

strictモジュールは、すでにバージョン宣言によって有効になっているので、Perl 5.36では、バージョン宣言によってstrictとwarningsが有効になります。

# これまで
use strict;
use warnings;

# Perl 5.36以降
use v5.36;

将来Perl 7がリリースされた場合は、マイナーバージョンを省略して、以下のように書けます。

use v7;

サブルーチンシグネチャが実験的ではなくなりました

サブルーチンシグネチャが実験的ではなくなり、バージョン宣言を行うと有効になります。サブルーチンシグネチャは、引数をサブルーチン名の後ろに記述できる機能のことです。

use v5.36;

sub add ($x, $y) {
  return $x + $y;
}

これまで、書いていたサブルーチンは次のように書けます。

# これまで
sub add ($x, $y) {
  my ($x, $y) = @_;
  
  $y = 3 unless defined $y;
  
  return $x + $y;
}

# v5.36
sub add ($x, $y = 3) {
  return $x + $y;
}

ただし、サブルーチンシグネチャで書かれたサーブルーチンは、引数の個数のチェックが行われることに注意してください。与えられた引数が少ないあるいは多い場合は、例外が発生します。

引数が多い場合の引数チェックを省略させたい場合は、以下のように記述します。

sub add ($x, $y, @) {
  return $x + $y;
}

実験的なtry-catch-finally構文

実験的なtry-catch-finally構文が書けるようになりました。

use feature 'try';

try {
  
}
catch ($e) {
  
}
finally {
  
}

「-g」コマンドラインフラグ

perlコマンドで、ファイルを一度に読みこむオプション「-g」が追加されました。

perl -n -g -E 'if (m|<h1>(.*?)</h1>|) { say $1; }' a.html

これまでPerlは「-0777」というオプションで、同じ機能を実現できていましたが、頻繁に使われるので、使いやすいオプション名が追加されました。

perl -n -0777 -E 'if (m|<h1>(.*?)</h1>|) { say $1; }' a.html

Unicode 14.0がサポートされました。

Unicode 14.0がサポートされました。

builtin名前空間

実験的に標準関数用のbuiltin名前空間が追加されました。Perlが、名前の衝突を気にせずに、関数を追加することができるようになりました。

my $true = builtin::true;

use builtin 'true';

my $true = true;

builtin名前空間のすべての関数は現在実験的です。

true関数、false関数、is_bool関数の追加

真偽値を表すbuiltin::trueとbuiltin::false関数が追加されました。

# 真
builtin::true;

# 偽
builtin::falsebuiltin::false;

「builtin::true」は「!!1」、builtin::false「!!0」と等価です。

builtin::is_bool関数で、真偽値をチェックできるようになりました。

if (builtin::is_bool $bool) {
  
}

JSONを生成するときなどに便利です。

数値と文字列の区別ができるようになりました

Perl 5.36では、builtin::created_as_number関数とbuiltin::created_as_string関数を使って、数値と文字列を区別できるようになりました。JSONなどのシリアライザーで使われることが想定されています。

if (builtin::created_as_number $data) {
  
}

if (builtin::created_as_string $data) {
  
}

builtin::is_boolを組み合わせて使うと、JSONのシリアライズとデシリアライズをコアの関数だけを使って、正しく行うことができます。

if (builtin::is_bool $data) {
  
}
eleif (builtin::created_as_number $data) {
  
}
elsif (builtin::created_as_string $data) {
  
}

builtin::trim関数

builtin::trim関数が追加されました。前後の空白を取り除くことができます。

my $trim = builtin::trim $string;

複数個の要素のイテレート

複数個の要素をイテレートするfor文が追加されました。この機能は、実験的です。

for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

Perl 5.36をすぐにインストールするには?

perlbrewあるいはplenvを使うと、Perl 5.36をすぐに試すことができます。

perlbrew

perlbrew install perl-5.36.0

plenv

plenv install 5.36.0

すべての変更を見る

すべての変更点を見るには、perldeltaを見てください。

perldelta

過去のリリース情報はこちらにあります。

Perlリリース情報

感想

Perl 5.36リリースおめでとうございます。開発者の皆様、ありがとうございます。

「use warnings」がバージョン宣言で、有効になって、バージョン宣言を使う動機が増えそうです。

複数イテレートforループは、使う機会がありそうです。

「-g」オプションでワンライナーが簡単になりますね。

trimも使用頻度が高そうです。

文字列・数値・ブールが区別できるようになったのは、とても良いです。

サブルーチンシグネチャの引数の個数チェックは、予期しない実行時例外が発生するので、高い信頼性が必要とされるプロダクトの本番環境で使用された場合に、ちょっと心配ではあります。

関連情報