Shogo's Blog

May 16, 2022 - 2 minute read - perl

Perl の extra_paired_delimiters を先取り!

そういえば Perl 5.36 もうすぐリリースだなー、なんか面白い変更あるかなー、 と perldelta を眺めていたら、あった!!!!

というわけで Perl 5.36 から導入されるらしい extra_paired_delimiters を試してみました。

Paired Delimiters

他の多くの動的言語では、シングルクォーテーション(') やダブルクォーテーション(")で囲うことで文字列を表します。 これは Perl でも同じです。

use 5.35.11;
use utf8;

say 'Hello World';
say "Hello World";

でもこれだけだとシングルクォーテーションやダブルクォーテーションを含む文字列を表現しようとしたときに、 エスケープが必要になります。 これくらいの短い文字列であれば余裕ですが、あまり長くなると大変です。

use 5.35.11;
use utf8;

say '\'Hello\' "World"';
say "'Hello' \"World\"";

Perl にはそれを解決するための便利な記法があります。 例えば q(文字列) と書くと '文字列' と書いたのと同じ意味になります。 ( ) 以外にもいくつかペアがあり、以下はすべて同じ意味になります。

use 5.35.11;
use utf8;

say 'Hello World';
say q(Hello World);
say q<Hello World>;
say q[Hello World];
say q{Hello World};

この記法が便利なのは「カッコの対応をチェックしてくれる」という点です。 例えば q((Hello) World) という文字列の場合、ナイーブな実装であれば (Hello までが文字列として判定されてしまうでしょう。 しかし Perl は賢いので、 (Hello) の先頭と末尾のカッコが対応していることを認識し、 (Hello) World をひとつの文字列として扱ってくれます。

use 5.35.11;
use utf8;

say q((Hello) World);

この記法は文字列だけでなく qr//, s/// のような正規表現記法にも使えます。 詳しくは Perl のドキュメントをどうぞ。

Extra Paired Delimiters

ここまでは古い Perl でも使える機能のお話でした。 今月リリース予定の Perl 5.36 では使えるペアが「大幅に増えます」。

この新機能を使うには extra_paired_delimiters feature flag を有効化する必要があります。 また、まだ実験的機能なので普通に使うと警告がでます。 この警告は no warnings "experimental::extra_paired_delimiters"; で抑制可能です。

この機能を有効化すると、例えば « » が区切り文字として使えます。

use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";

say q«Hello World!»;

このへんは日本人にとっては、ありがたいですね。

use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";

say qHello World!;
say qHello World!;
say qHello World!;

僕はあまり馴染みのない文字ですが、常用している地域もあるんでしょうか?

use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";

say qHello World!;
say qHello World!;

・・・なるほど・・・?

視覚的にわかりやすいかも・・・?

use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";

say q👉Hello World!👈;
say qHello World!;
say qHello World!;

どうしてこうなった。

完全な一覧はこちらをどうぞ。

まとめ

Perl の文字列の区切りにカッコを使用することができます。 今までは4種類 (( ), < >, [ ], { })だけでしたが、5.36からその種類が大幅に増えます。 まだ実験的機能なので今後変更・廃止される可能性もありますが、とても・・・ユニークな機能ですね。

いったい Perl はどこへ向かっているんだろう・・・?

スケジュール通りなら Perl 5.36 は 5/20 リリースです!楽しみですね!

参考