Perl 5.12.0 がリリースされました!

Perl 5.12がリリースされました。5.12は5.10からの様々なバグフィックスや新機能・改良が追加されていますが、ユーザーにとってより重要なのは、それらの変更よりよりフォーマルかつ定期的ななリリースサイクル(開発版を毎月リリースしていくスタイル)を経て開発が進められた事が重要なリリースであると言えます。

Perlの主開発者達はPerl 5.8のリリースからPerl 5.10のリリースまでに5年間という長い期間を要した反省を生かし、定期的なリリースを繰り返すことにより確実に、そしてより早いタイミングでバグフィックスや新機能をユーザーに届けようという試みを5.10のリリース後に始めました。そしてはこれはその結果を反映した最初のリリースなのです。

Perl 5.12のリリースノートには以下のように書かれています:

This release cycle marks a change to a time-based release process.
Beginning with version 5.11.0, we make a new development release
of Perl available on the 20th of each month.  Each spring, we will
release a new stable version of Perl.  One month later, we will make a 
minor update to deal with any issues discovered after the initial ".0"
release. Future releases in the stable series will follow quarterly.
In contrast to releases of Perl, maintenance releases will contain fixes
for issues discovered after the .0 release, but will not include new
features or behavior.

これによれば毎月20日に開発版を、毎年春に新しい安定版を、".0"リリースの後には1ヶ>月で最初の修正版、そしてその後は3ヶ月に1回メンテナンス版をリリースしていく予定と
の事です(メンテナンス版はバグフィックスのみで新機能は追加されません)。


なお以下に5.12で追加された機能をいくつか紹介します。これ以外にも色々とありますので、詳細は是非perl5120deltaでご覧下さい。

use 5.12

これまでのPerl5でも`use 5.8; use 5.10;` のような書き方ができていましたが、5.12で
はそれ以外の効果ももたらします。perl 5.12では

    use 5.12.0;
と宣言することにより、

    use strict;
    use feature ':5.12';
と同等の効果をもたらします。
逆にuse features ':5.12' は

    use feature 'unicode_strings';
    use feature 'say';      # say()
    use feature 'switch'; # given...when
    use feature 'state';   # state変数

と同等の効果をもたらします。

このような効果はレキシカルスコープで有効になります。例えば

    use 5.12.0;
    $foo = 1;
はエラーになりますが、以下はエラーになりません:

    { # このスコープではstrictが有効
       use 5.12.0;
    }

    { # 違うスコープ
        $foo = 1;
    }

... オペレータ

今はとりあえずプレースホルダーだけ設定して、あとで実装を追加する予定のコードなど
に「あとで実装する」コメントの代わりに使用する事ができます。

以下のように書いておくと、foo()を実行した際に"..."の行で例外が発生します

     sub foo {
         my $self = shift;
         ...
     }
package NAME VERSION 記法

これまでモジュールのバージョンを設定する際には$VERSION変数に値を設定する必要がありました:

      package MyModule;
      our $VERSION = 1.23;

perl 5.12からは以下のように1行でこれを設定できます:

      package MyModule 1.23;
この記法は以下の宣言と同等です:

      package MyModule;
      our $VERSION;
      BEGIN {
           $VERSION = version->parse(1.23);
      }

このようにBEGINフェーズで実行されることと、暗示的にversion.pmが使用されることが>ポイントです。なおversion.pm を経由するため、version.pmが認めている書式しか使用することができないようになります。

プラッガブル キーワード
これは一般のユーザーには全く関係ない機能ですが、これまでDevel::Declareモジュール
などを使用する必要のあった言語の拡張をPerlコアのレベルでサポートするようになりま
した。