Perl 5.18 がリリースされました
Perl 5.18がリリースされました。パチパチパチ。
バージョンアップするときに注意する点
今回のPerl 5.18 へのバージョンアップは、すぐに行うのは、少し待ったほうがよいという感じがします。
一つ目は、Perlのkeys,values, eachが、実行するたびに異なるキー、値の順序を返すようになったので、同じ順番を期待している実装で問題がでます。JSON::XSが現在は、試験に失敗することが知られているようです。ということは、CPANにあるモジュールの試験がうまくいかないモジュールがしばらく残るうちは、少し不安がありますね。
これはセキュリティのほうが大事というPerlコミュニティの判断のようです。
次に、Perl 5.10移行で導入された、given - when構文とスマートマッチ(~~)が実験的な機能に差し戻されました。given - when構文、スマートマッチを利用している場合は、experimentalという警告が発生します。「no warnings 'experimental'」で、警告を無効にできますが、スマートマッチの実装と挙動が将来的に、変わる可能性が非常に高いのでおすすめしません。
given - when構文、スマートマッチを使用している場合は、それを使わない方法に書き換えることが推奨です。以下のコマンドで、givenやスマートマッチを使用しているPerlのファイルがないかどうかを確認しましょう。
grep -r '~~' dir | grep -e '\.p[lm]' grep -re 'given \+(' dir | grep -e '\.p[lm]'
スマートマッチ演算子を使用している場合は、通常の演算子「eq」「==」に書き換えましょう。
$var ~~ 1 -> defined $var && $var == 1 $var ~~ [1, 2] -> (defined $var && $var == 1) || (defined $var && $var == 2)
given whenは通常のif文に書き換えましょう。
また削除された構文としてfor文の中のqw(...) はもはやかっことして使えなくなりました。
# 廃止 for my $str qw(a b) { } # 書き換え for my $str (qw(a b)) { }
上記のように互換性が壊れる変更で、使われている可能性がそれほど低いとはいえないものがあるので、バージョンアップするときには、今回は試験が必須だと思われます。
次のバージョンでコアから取り除かれるCPANモジュール
以下のモジュールはPerl 5.18で廃止予定になり、将来のバージョンでPerlコアから取り除かれます。利用している場合は、CPANからインストールして利用することができるので安心です。
encodingプラグマが廃止予定になっています。encodingプラグマは非推奨ですので、使わないようにしましょう。日本語を扱うときは、utf8プラグマとEncodeモジュールを使うようにしましょう。
CPANPLUSが廃止予定になっています。cpanもありますし、簡単便利なcpanmがあるので、コアにCPANPLUSは必要ないとの判断のようです。
その他、Module::Pluggable、Log::Message、Object::Accessorなどが、廃止予定となっています。
encoding
Archive::Extract
B::Lint
B::Lint::Debug
CPANPLUS
CPANPLUS::Backend
CPANPLUS::Backend::RV
CPANPLUS::Config
CPANPLUS::Config::HomeEnv
CPANPLUS::Configure
CPANPLUS::Configure::Setup
CPANPLUS::Dist
CPANPLUS::Dist::Autobundle
CPANPLUS::Dist::Base
CPANPLUS::Dist::Build
CPANPLUS::Dist::Build::Constants
CPANPLUS::Dist::MM
CPANPLUS::Dist::Sample
CPANPLUS::Error
CPANPLUS::Internals
CPANPLUS::Internals::Constants
CPANPLUS::Internals::Constants::Report
CPANPLUS::Internals::Extract
CPANPLUS::Internals::Fetch
CPANPLUS::Internals::Report
CPANPLUS::Internals::Search
CPANPLUS::Internals::Source
CPANPLUS::Internals::Source::Memory
CPANPLUS::Internals::Source::SQLite
CPANPLUS::Internals::Source::SQLite::Tie
CPANPLUS::Internals::Utils
CPANPLUS::Internals::Utils::Autoflush
CPANPLUS::Module
CPANPLUS::Module::Author
CPANPLUS::Module::Author::Fake
CPANPLUS::Module::Checksums
CPANPLUS::Module::Fake
CPANPLUS::Module::Signature
CPANPLUS::Selfupdate
CPANPLUS::Shell
CPANPLUS::Shell::Classic
CPANPLUS::Shell::Default
CPANPLUS::Shell::Default::Plugins::CustomSource
CPANPLUS::Shell::Default::Plugins::Remote
CPANPLUS::Shell::Default::Plugins::Source
Devel::InnerPackage
Log::Message
Log::Message::Config
Log::Message::Handlers
Log::Message::Item
Log::Message::Simple
Module::Pluggable
Module::Pluggable::Object
Object::Accessor
Term::UI
Term::UI::History
新規機能の追加
experimentalプラグマの導入
experimentalプラグマが導入されました。新しく追加される機能はexperimanl警告を出すようにしてリリースされ、安定した段階で、experimenal警告をはずずような運用に変更されました。
レキシカルサブルーチン
実験的な機能として、レキシカルなサブルーチンを定義する機能が追加されました。
use 5.018; no warnings "experimental::lexical_subs"; use feature "lexical_subs"; { my sub foo { ... } }
Perlのサブルーチンの定義はすべてグローバルなものでしたが、スコープの中でだけ有効になるサブルーチンが書けるようになりそうですね。
またパッケージの中だけで有効になるourも使えます。
{ our sub foo { ... } }
Unicode6.2への対応
PerlはUnicode 6.2に対応しました。\N{BELL} は U+0007 ではなく U+1F514 を参照するようになったという互換性が崩れる変更があるので注意してください。"BELL" は U+1F514 を参照し、U+0007 の名前は "ALERT" になりました。
kill関数が「-INT」のような指定ができるようにった
kill関数が「-INT」のような指定を行って、グループに対してシグナル名でシグナルを送ることができるようになりました。