Perl 5.36.0 中出現的實驗機能 `extra_paired_delimiters`

作者:   發佈於: ,更新於:   #perl

看來應該是伴隨 Unicode 14.0 而一併出現的機能。

所謂的 paired delimiters 指的是像 ()[]{} 這種兩個一組的符號。可以配合 q 運算符來把字串括住,也就是所謂的「括號」。除了單引號 '' 雙引號 "",透過 q 運算符就可以使用各式各樣的半形字符(字碼在 127 以下的)來當括號。

say 'It\'s a beautiful day.';
say q(It's a beautiful day.);  # 意義同上。或許比較好讀一些。

#=>
# It's a beautiful day.
# It's a beautiful day.

這種設計會出現的主要理由,是讓人便於在程式碼中定義各種內含括號的字串。普遍來說程式碼中的字串內容如果帶有符號,尤其是括號,就要以倒斜線字符 \ 來「跳脫」。如果以單引號 ' 來括,字串內的單引號就前就得加上跳脫字符 \

自 Perl v5.36.0 起,perldoc feature 內多了一段 extra_paired_delimiters 。看來是讓 Unicode TN39 內所定義的成對刮號都可以拿來當原始碼中的字串括號使用。但是,除了一般寫文章會用到的幾組全型括號 「」『』〖〗之外,還有許多不太尋常的選項:

use v5.36;
use utf8;
use feature 'extra_paired_delimiters';

say q🔊電腦說:「你好,今天真是不錯。」🕪;
say q🖝怎麼這樣?🖜;
say q𝄆𝄞🎵這個字串𝄀𝄿不𝄿會自𝄀動反覆🎶𝄇 ;

#=>
# 電腦說:「你好,今天真是不錯。」
# 怎麼這樣?
# 𝄞🎵這個字串𝄀𝄿不𝄿會自𝄀動反覆🎶

可用來當左右括號的字符列表很長,在 perldoc feature 文件中有完整列出。

稍微翻了 perl5.git commit 記錄,看來有許多額外追加進去,而不在 Unicode TN39 列表內的符號。

但既然至少是包含了 Unicode TN39 這定義,可以想見未來或許會隨著 Unicode 本身的演進而演進。而這些括號字符的字碼幾乎全部都在 127 以上,也就是說如果不在源碼開頭加上 use utf8;,其實也是無法真正拿那些字符出來用的。

粗略想起來,我真的很少需要在程式碼中寫很大量的字串。需要內嵌大量「滿是括號」的字串的機會更是很少。理論上最有可能發生的時機大概就是要在 Perl 程式碼中內嵌帶 Vue 變數的 HTML,而其內容還是中文小說的狀況。這麼狀況下 <>, "", '', {}, 「」, 『』 說不定真的會同時出現在字串內。而讓人會想要使用 🖝🖜 來當括號......

總之,若能夠少寫一些跳脫用的倒斜線字符,就能讓易讀性向上提升一些,也可以減少在改字串內容時忘記要補上倒斜線的人爲疏失。雖然有點奇妙,但姑且就先記得有這一項選擇,看看有沒有那天會真的可以用上。

對於已經習慣使用輸入法來繕打各種全形括號的 CJK 使用者而言,或許更能善加利用這項機能吧。