本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回のハッカーは鍛治匠一さんで、
Perl 6リリース!
2015年のクリスマス、
今回は、
なお、
リリースまでの道のり
簡単にPerl 6の歴史を振り返ります
今から16年前の2000年にPerl 6プロジェクトは始まりました。そのころPerl 5のソースコードは非常に複雑になっており、
2005年、
2016年現在では、
Perl 6の長所
実際にPerl 6に触る前に、
文法が多く表現力が豊か
Perl 6に少し触れてみればわかりますが、
たとえばPerl 6にはジャンクションという機能があります。ジャンクションとは同時に複数の値のように振る舞える1つのスカラのことで、
if ($n == 1 || $n == 3 || $n == 5) { ... }
if $n == 1|3|5 { ... }
オブジェクト指向、メタプログラミングのサポート
Perl 6はいろいろなプログラミング手法をサポートしています。特にオブジェクト指向については必要十分な機能が備わっています。また、
Perl 6では、class
キーワードでクラスを、has
キーワードでメンバー変数を定義できます。また^
からはじまるメソッドによってクラス自身を操作することができます。
# クラスの定義
class Person {
has $.first-name;
has $.last-name;
method name() {
$!first-name ~ ' ' ~ $!last-name;
}
}
my $me = Person.new(
:first-name<Shoichi>, :last-name<Kaji>
);
say $me.name; # Shoichi Kaji
# メソッドの動的追加
Person.^add_method: 'greet', method () {
say "Hi, my name is {self.name}.";
};
$me.greet; # Hi, my name is Shoichi Kaji.
強力な正規表現
Perlはもともとテキスト処理のために作られたプログラミング言語です。そしてテキスト処理の中心的な役割を担うのが正規表現です。Perl 6ではこの正規表現がさらに進化しました。
正規表現はややもすると複雑になり、
second=b
hits=42
perl=6
のようなkey=value
からなる設定ファイルをパースするコードは、
# https://doc.perl6.org/language/grammarsから
# 一部改変して抜粋
grammar KVPairs {
# 与えられた文字列は
# TOPでテストされパースされる
token TOP { [<pair> \n+]* }
token ws { \h* }
rule pair {
<key=.id> '=' <value=.id>
}
token id { \w+ }
}
class KVActions {
# $/でマッチオブジェクトを受け
# それの処理方法を記述していく
method id($/) {
$/.make: ~$/;
}
method pair($/) {
$/.make: $<key>.made => $<value>.made;
}
method TOP($/) {
$/.make: $<pair>».made;
}
}
my $content = "setting.ini".IO.slurp;
# grammar KVPairsで$contentをパースし
# KVActionsに従ってそれを処理する
my $res = KVPairs.parse(
$content, :actions(KVActions)
).made;
for @$res -> $p {
say "Key: $p.key()\tValue: $p.value()";
}
# Key: second Value: b
# Key: hits Value: 42
# Key: perl Value: 6
grammar KVPairs
で文字列をどのようにパースするかを定義しています。KVPairs.
が呼ばれると、$content
とKVPairs
のTOP
とのマッチが試されパースされます。class KVActions
はそのパースされた結果をどう扱うかを定義しています。
並行/非同期プログラミングのサポート
Perl 5の大きな欠点に、
たとえば以下は、start {}
によって非同期にHTTPリクエストを発行し、await
によってそれらが終了するのを待っています。
sub http-get($url) { ... }
my @url = (...);
my @result = await @url.map: -> $url {
start { http-get($url) };
};
以上、
Perl 6のインストール方法
では、
インストールには主に2つの方法があります。
- MoarVM、
NQP、 Rakudo、 有用なモジュール一式をtarballにまとめたRakudo-Starをインストールする - Rakudo管理ツールrakudobrewを使って、
MoarVM、 NQP、 Rakudoをそれぞれソースリポジトリから取得してインストールする
Rakudo Starのほうがすべて1つのtarballにまとまっていて簡単にインストールできますが、
rakudobrewを使ったインストール
rakudobrewをインストールしたのち、
$ git clone https://github.com/tadzik/rakudobrew \
~/.rakudobrew
$ echo 'export PATH=$HOME/.rakudobrew/bin:$PATH' \
>> ~/.bash_profile
$ source ~/.bash_profile
$ rakudobrew build moar
(5~10分間ほどかかります)
Rakudoをアップデートする場合は、rakudobrew build moar
を再度実行してください。
外部モジュールのインストール
外部モジュールを使う場合は、
次節でREPLLinenoise
という外部モジュールを入れておきましょう。
$ rakudobrew build panda
$ panda install Linenoise
Linenoise
を入れることで、
Perl 6はじめの一歩
それでは、
REPLでHello, World
perl6
とだけ打てば組込みのREPLが起動しますので、
$ perl6
To exit type 'exit' or '^D'
> say "Hello, World";
Hello, World
p6ファイルでHello, World
次にファイルに書いて実行してみます。Perl 6は拡張子として、
use v6;
say "Hello, World";
$ perl6 hello.p6
Hello, World
hello.use v6
と書きましたが、
$ perl hello.p6
Perl v6.0.0 required--this is only v5.24.0
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT