スキップしてメイン コンテンツに移動

Perl 7 より先に Perl 5.34 が出るぞという話

Perl 5 の次期バージョンとして一部後方互換でない変更 (主に間接オブジェクト記法の削除とベストプラクティスのデフォルトでの有効化) を含んだメジャーバージョンアップである Perl 7 がアナウンスされたのは昨年の 6 月 のことだったが、その前に Perl 5 の次期周期リリースである Perl 5.34 が 5 月にリリース予定である。

現在開発版は Perl 5.33.8 がリリースされておりユーザから見える変更は凍結、4 月下旬の 5.33.9 で全コードが凍結され 5 月下旬に 5.34.0 としてリリース予定とのこと。

そういうわけで事前に新機能の予習をしておく。

8進数数値リテラルの新構文

見た瞬間「マジかよ」と口に出た。これまで Perl はプレフィクス 0 がついた数値リテラルを8進数と見做してきたが、プレフィクスに 0o (zero, small o) も使えるようになる。 もちろんこれは2進数リテラルの 0b や 16進数リテラルの 0x との一貫性のためである。リテラルと同じ解釈で文字列を数値に変換する組み込み関数 oct も` 新構文を解するようになる。

昨今無数の言語に取り入れられているリテラル記法ではあるが、この記法の問題は o (small o) と 0 (zero) の区別が難しいことで、より悪いことに大文字も合法である:0O755

Try / Catch 構文

Perl 5 のリリース以来 30 年ほど待たれた実験的「新機能」である。 Perl 5 における例外処理が特別な構文でなかったのは予約語を増やさない配慮だったはずだが、TryCatch とか Try::Tiny のようなモジュールが氾濫して当初の意図が無意味になったというのもあるかも知れない。

use feature qw/try/;
no warnings qw/experimental::try/;

try {
  failable_operation();
} catch ($e) {
  recover_from_error($e);
}

Raku (former Perl 6) だとCATCH (大文字なことに注意) ブロックが自分の宣言されたスコープ内で投げられた例外を捕らえるので字句的変数を参照できたりして便利なのだが、Perl 5 のそれはもっと月並な C++ / Java スタイルに落ち着いたようだ。

ともあれこれでも eval BLOCK と比べると便利である。何しろただのサブルーチン呼出し式ではなくれっきとした文なので尻にセミコロンがなくて怒られるという凡ミスがない。また try ブロックはサブルーチンの構文糖衣ではない本物のブロックなので return が食われない:

sub f {
  try {
    return 'return from try';
  } catch ($e) {}
  return 'return from sub';
}

say f();  # return from try

文なので subdo の最後にあるときは自身の最後に評価された式の評価結果が値になる:

my $result = do {
  try {
    failable_operation() or die;
    'success';
  } catch ($e) {
    'failure';
  }
};
say $result;  # 'success' or 'failure'

一般量化子の左端が省略可能になった

正規表現の量化子は全部で 4 種ある。即ち * / + / ? / {m,n} である (厳密に言えばそれぞれに最小マッチを優先するバリエーションがあるのでそれを含めると全 8 種。)

最後の {m,n} が最も一般的な形で、つまり m 回以上 n 回以下 (inclusive) の繰り返しにマッチする。右端は省略可能で、その場合無制限にマッチする。i.e., {m,} は m 回以上の繰り返しにマッチする。 これが今回左端も省略可能になり、その場合 0 回以上の出現、つまり出現しない場合にもマッチするようになる。i.e., {,n} は 0 回以上 n 回以下の繰り返しにマッチする。

左右両端を省略する ({,}) のは文法違反であることに注意。0 回以上の繰り返しは * である。

エスケープ・シーケンスやメタ文字のパラメータの前後に空白が挿入可能になった

二重引用符や正規表現内で使用できるエスケープ・シーケンスやメタ文字は数多いが、中には波括弧でパラメータを指定できるものもある。任意のバイトや Unicode コードポイントを書ける \x{} や Unicode 文字プロパティを指定する \p{} などが有名だろう。

これまで \p{} / \P{} を例外として、それらのパラメータの前後には空白を置くことができず、波括弧直後から記述を始める必要があったが、それが緩和された。 つまり文字を詰めることなく \x{ FEFF } のように記述して良くなった。

ちなみに前述の正規表現量化子についても同様で、{ m, n } のように書ける。この場合前後のみでなくカンマの後にも空白が置けることに注意。

コメント

  1. Perl7 はこれまでの CPAN 資産が使えなくなる可能性があり、下手をすると Perl6 の二の舞になる恐れがありました。だから Perl 5.34 のリリースは賛成です。RC1 の perldelta を読むと Windows ユーザーにもうれしいニュースがありますね!

    返信削除

コメントを投稿