August 30, 2005

Perl6 で配列操作

いやなブログ: 配列操作の比較表: Ruby, Python, JavaScript, Perl, C

プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。

ということで perl6 (pugs) で調べてみました。

RubyPerl6
a = [1, 2, 3]@a = (1, 2, 3)
a.length@a.elems
a.empty?@a.elems == 0
a.push(x)@a.push($x)
a.unshift(x)@a.unshift($x)
a.pop@a.pop
a.shift@a.shift
a.concat( b )@a.push(@b)
a.clear@a = ()
a.insert(i, x)@a.splice($i, 0, $x)
a.delete(x)
a.delete_at(i)@a.splice($i, 1)
a.nitems { |e| e == x }@a.grep({ $_ == $x })
a.include?(x)any(@a) == $x
a.index(x)
a.first@a[0]
a.last@a[-1]
a[i, l] or a.slice(i, l)@a[$i..$i+$l-1]
a[i..j] or a.slice(i..j)@a[$i..$j]
a[i...j] or a.slice(i...j)@a[$i..$j-1]
a.sort@a.sort
a.sort!@a = @a.sort
a.reverse@a.reverse
a.reverse!@a = @a.reverse
a.uniq@a.uniq
a.uniq!@a = @a.uniq
a.join(d)@a.join($d)
a.eachfor @a => $x { ... }

Pugs の svn からとってきた最新でためしています。 iif (any(@a) == $x) { } が perl6 っぽい。

ここではプリミティブをオブジェクトで扱いましたが、もちろんビルトインの function をつかって、push @a, 1; って書き方もそのまま使えます。perl6 ではプリミティブデータ型とそのリファレンスの操作においての区別はほとんどなく、

$foo = [1, 2, 3]; $foo.push(4);

なんてやれば思ったとおりに動きます。ちなみに perl5 でも CPAN モジュールの autobox を使うと、first-class object を扱えるようになるみたい。2年前の LL Saturday でこのネタしゃべった覚えが。。

Posted by miyagawa at August 30, 2005 08:18 AM | Permalink | Comments (2) | TrackBack(1)
Comments

# for $a => $x { ... }
for @a -> $x { }
# だよ

Posted by: on September 2, 2005 03:52 AM

修正しました。

Posted by: miyagawa on September 4, 2005 04:15 PM
Trackbacks
TrackBack URL for this entry: http://blog.bulknews.net/mt3/mt-tb.cgi/1793
CGI(Perl)の配列とは?
Excerpt: 今回は、Perlプログラミングで使用する配列について解説します。 配列とは、同じ型のデータ(変数)を連続的に並べ...
Weblog: ネットビジネス用CGI Perl HTML Javascriptの情報サイト
Tracked: April 29, 2006 11:09 PM
Post a comment