Perl6をちょっと使ってみてつまづいた点

 前回の記事に書いたように、Perl6でプログラムを書いてみた。つまづいたところなどをリストアップしてみる。

配列のdeleteメソッド

 Perl6では、Perl5と同様に配列にたいしてdeleteメソッドを使うことができる。

my @array = <Cheetah Puma Jaguar Panther Tiger Leopard>
@array.delete(1);    # 配列の2つ目(Puma)を削除
say @array;

 このコードの3行目で、以下のように出力されるのが正しい(と思う。あまりPerl6に詳しくないので断定は避ける)。

Cheetah Use of uninitialized value Jaguar Panther Tiger Leopard

※この出力結果は、わかりやすさのために要素間に半角スペースを入れている。

 しかし、実際に動かしてみたところ、3行目で配列にアクセスしたところで、"Null PMC access in isa()"というメッセージがでた。軽く調べたところ、既にバグとして報告されているようだが、修正はされていないようだった。

 この問題は自分にはどうにもできそうになかったので、「誰か回避策など教えてくれないかなー」と軽いノリでtwitterにつぶやいたところ、@carlmasak氏からreplyがあり、バグを直してくれるという。そして、このバグは次の日に修正された。

 現在、最新のコードを落としてきて使えば、"Null PMC access in isa()"はでなくなっている。まさかtwitterで一言呟いただけで修正されるとは思っていなかったので正直驚いた。特に日本語での呟きを拾ってくれたことに。@carlmasak氏に感謝。

文字列を1文字ずつとりだす

 この処理をPerlで書くならば、以下のように書くのが一番楽だ。

@characters = split //, $string;

このように書く事で、$string変数内の文字列を1文字ずつにわけて、@characters配列に格納してくれる。

 が、Perl6ではこの方法は使えない。どうやら、そういう仕様のようだ。誰かこれの代わりになる手法を知っていたら、教えていただけないだろうか。

変数の文字列長

 僕の記憶が確かならば、Perl5では変数の文字列長は次のコードで取得できる。

say length $string;

 が、Perl6にはlengthメソッドがない。調べてもわからなかったので教えてもらったのだが、Perl6ではcharsメソッドになっている。

say chars $string;

その他少し戸惑ったこと

 もう長いことPerlを使っていなかったので、うろ覚えなところもあるのだが、Perl5以前とPerl6では制御構文も結構変わっているようだ。

Perl5 Perl6
foreach for
for loop
- given

(givenはC言語などのswitchに相当。Perl5にはない)
※間違いがあれば指摘していただけると助かります。

日本語の情報は少ないが

 僕はPerl6に期待している。もちろん、これまでのPerl4、Perl5は好きだけれど、Perlを愛して止まない少なからぬ人たちがPerl6を世に広めようとしているのだから、それだけの期待をしていいものだと思っている。数年ぶりにPerlに触れることになったが、今後はPerl6を積極的に使っていきたい。

 今Perl6を使う上で個人的に一番問題となるのが日本語の情報の少なさである。英語を正しく訳す自信は全くないが、Perl6を使っていくためには英語のドキュメントと向き合う必要がある。自分が英語と向き合って、日本語の情報を増やしていきたい。