Humanity

Edit the world by your favorite way

Perlの好きなところ・便利なところ

Perl 6 チュートリアル 9日目:引数と引数渡し - ヤルキデナイズドだった

Perl6では配列がデフォルトではフラットに展開されないらしい。
Perlの素晴らしい所の一つなのに・・・と思ったけどやっぱりフラットに展開するようにもできるみたい。
単項の|なんてまたややこしくなりそうな記号を(ry


利点としては、これのおかげでapplyの必要がない点とか。
あとmap関数で配列からハッシュ*1へ変換したり、またその逆のほとんどがsplit, join, mapの組み合わせで可能だったりする。

my $header = <<EOH;
Foo-Header: bar
Hoge-Header: uboa
EOH

# RubyとかPythonとか、配列がリファレンス(オブジェクト?)な言語だったら
# map中でsplitしたら[[key => val], [key2 => val2], ...]ってならない?
# いや実はよく知らないんだけど...
#
# my %header = map {
#     split /:\s*/
# } split /\n/, $header;
#
# ・・・あ、上のだと値に「:」があった場合キーと値が1対1にならなくなるな。
# じゃ、正規表現で。
#
my %header = map {
    /^ ([^:]+) : \s* (.*) $/x;
    ($1, $2);
} split /\n/, $header;



my $key_val = "foo\0bar\0hoge\0uboa";
my %key_val = split /\0/, $key_val;


# もしリファレンスを含むならTie::RefHash使えばリファレンスもキーとして使える
my %val_key = reverse %key_val;

grepだってmapで代用可能だしね。

my @one_to_ten = 1..10;
my @odd = grep { $_ % 2 } @one_to_ten;
# my @odd = map { $_ % 2 ? $_ : () } @one_to_ten;

こんな風にテキストから配列、ハッシュへの変換がめちゃくちゃ楽なのは、この配列の仕様、それとハッシュと配列がシームレスに変換可能なのが理由だと思う。
シュワルツ変換とかめっちゃ楽。




・・・あとはPerl6で

とか色々できると素晴らしいと思う。

*1:これは実際は(キー => 値, ...)という配列と同じ。