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;