Perl Hackers Hub

第14回最新Perl使いこなし術―リファレンスの引き方、5.10以降の新機能(3)

5.12からの機能

続いて5.12からの機能です。

yadayada演算子─⁠─サンプルコードで便利

yadayada演算子は...と書きます。挙動としてはdie"Not Implemented"とまったく一緒です。本稿のサンプルコードでも実は使っています。サンプルコードなどで「ここに何か処理を書きますよ」というのを...と書いておいても、そのまま実行できて便利です。

「ヤダヤダ」は実装するのが嫌でダダをこねているわけではなくて、アメリカ英語で「かくかくしかじか」みたいな意味のようです。

package VERSION構文─⁠─バージョン宣言が楽に

5.12からはpackage宣言がバージョン番号をとれるようになりました。次のように、パッケージ名のあとにバージョン番号を指定できます。

package MyApp 1.10;

ここで指定した番号は、バージョンオブジェクトという比較しやすいオブジェクトにパース・変換されたうえで$MyApp::VERSIONに設定されます。

今までバージョンの示し方は、次のように文字列で宣言し、そのあとevalで数値化する謎のおまじないが必要なケースがあったのですが、今回追加された構文によってその必要がなくなりました。

package MyApp;
our $VERSION = "1.10";
$VERSION = eval $VERSION;

歴史的経緯からくるおまじないを排除できるのはとてもうれしいことです。

5.14からの機能

最後は5.14からの機能です。

s///r─⁠─rオプションで非破壊置換

置換演算子s///と変換演算子y///にrというオプションを付けることで、非破壊的に置換を行うことができるようになりました。非破壊的とは、⁠元の変数が変更されない」ということです。

例を示します。次のコードはrオプションのありなしの挙動を示したものです。

my $string = "foobar";
say $string =~ s/foo/aaa/r; #=> aaabar  …(1)
say $string; #=> foobar  …(2)

say $string =~ s/foo/aaa/; #=> 1  …(3)
say $string; #=> aaabar  …(4)

(1)はrオプションを付けた場合で、置換結果が演算結果になります。そして(2)で確認しているとおり、元の値$stringは変わりません。一方(3)のようにrオプションを付けないと、演算結果は置換したかどうかになり、(4)のように元の値が変更されます。

このオプションはmapなどでたいへん便利に使えます。

(1)rなし
map { my $s = $_; $s =~ s/^/0/; $s } qw/a b c/;

(2)rあり
map { s/^/0/r } qw/a b c/;

(3)Modification of a read-only value attempted
map { s/^/0/; $_ } qw/a b c/;

上のコードの(1)のようにrなしだと煩雑ですが、(2)のようにrありだときれいに書けます。

(3)s///が破壊的なため、代入していない文字列に対して演算しようとするとエラーになる例です。これまでs///するためだけに代入しなくてはならないケースがしばしばありましたが、5.14からはrオプションによって簡潔に書けるようになります。5.14が使える環境では積極的に使っていきたい機能です。

push $arrayref─⁠─デリファレンスいらずの文法拡張

push、unshift、pop、shiftなどの関数が、リファレンスを受け付けるようになりました。これは特に入れ子になっているハッシュの中の配列を操作するときなどに便利です。

次のように、配列リファレンスをいちいちデリファレンスする必要がなくなります。

5.12まで
push @{ $foo->{array} }, 'a';
5.14から
push $foo->{array}, 'a';

ただ、この機能は実験的な機能という位置付けのため、まだあまり使わないほうがよさそうです。筆者は書き捨てのコードを書くときだけ、たまに使ったりしています。

packageブロック文─⁠─明示的なパッケージブロック

次のように、packageのあとにすぐブロックが書けるようになりました。

package MyApp {
}

これは次のコードと完全に一緒です。

{ package MyApp;
}

すなわち、ブロックの中はMyAppのパッケージのスコープとなります。先にブロックの始まりがくる従来の形だとブロックとパッケージの関係がよくわかりませんが、この文法拡張で明確になってうれしいですね。

deltaを見る

perl の新機能はperldoc perl5100deltaperldoc perl5120deltaperldoc perl5140deltaとすることで、該当バージョンでの変更を見ることができます。たとえばperl5140deltaであれば、5.14.0で追加された機能、変更された機能、バグフィックスなどを見ることができます。

今回紹介した以外にも細かな新機能は増えていますので、一度眺めてみるのも楽しいかもしれません。

まとめ

今回はリファレンスの引き方と、最近のPerlの機能の紹介をしました。特に最近のPerlの機能には便利なだけではなく、堅牢なコードを書きやすくなるdefinedor演算子のようなものもあります。基本的にPerlはバージョンを上げても互換性が高いので、ちょっと試してみるのもありだと思います。また、これから新しくPerlでアプリケーションを書き起こすなら、5.14.2など最新の安定版を使うのがお勧めです。

さて、次回は@techno_nekoこと伊藤智章さんによる「Perl meets beats」です。お楽しみに!

おすすめ記事

記事・ニュース一覧