そういえば 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 q「Hello World!」;
say q『Hello World!』;
say q【Hello World!】;
僕はあまり馴染みのない文字ですが、常用している地域もあるんでしょうか?
use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";
say q༺Hello World!༻;
say q꧁Hello World!꧂;
・・・なるほど・・・?
視覚的にわかりやすいかも・・・?
use 5.35.11;
use utf8;
use feature "extra_paired_delimiters";
no warnings "experimental::extra_paired_delimiters";
say q👉Hello World!👈;
say q⏩Hello World!⏪;
say q⏭Hello World!⏮;
どうしてこうなった。
完全な一覧はこちらをどうぞ。
まとめ
Perl の文字列の区切りにカッコを使用することができます。
今までは4種類 (( )
, < >
, [ ]
, { }
)だけでしたが、5.36からその種類が大幅に増えます。
まだ実験的機能なので今後変更・廃止される可能性もありますが、とても・・・ユニークな機能ですね。
いったい Perl はどこへ向かっているんだろう・・・?
スケジュール通りなら Perl 5.36 は 5/20 リリースです!楽しみですね!