カラクリサイクル

『輝かしい青春』なんて無かった人の雑記

Perlで配列を簡単にハッシュにする方法

概要: 本日はPerlに関する小ネタ。というか忘れないようにするメモ。


Perlで配列を簡単にハッシュにするには、

my @array = ( foo, bar, baz );
my %hash = map { $_ => 1 } @array;
# %hash = ( foo => 1, bar => 1, baz => 1 );

みたいにすればいい。誰でも思いつきそうやり方だけど最近まで気づかなかった。 でコレを利用すると配列からユニークな要素を取り出せる。

my @array = ( foo, bar, baz, foo, bar, baz, hoge, huga, moge );
my @array2 = keys map { $_ => 1 } @array;
# @array2 = ( foo, bar, baz, hoge, huga, moge );

++[date:2006/09/14-20:13:00] コメント欄で指摘されましたが上の例は微妙に動きません。

実際には

my @array = ( foo, bar, baz, foo, bar, baz, hoge, huga, moge );
my %hash = map { $_ => 1 } @array;
my @array2 = keys %hash;
# @array2 = ( foo, bar, baz, hoge, huga, moge );

としないとだめっぽいです。

あとコメント欄でfbisさんに教えてもらいましたが、 配列の重複消去は、

my @array = ( foo, bar, baz, foo, bar, baz, hoge, huga, moge );
my @array2 = do { my %t; grep !$t{$_}++ , @array };

でもできるみたいです。詳しくはコメント欄参照。

++

ただしmapsplitgrepなんかを続けすぎるとわけわかめな暗号文になる。

use CGI qw(path_info);
use URI::Escape;
my $path_info = join q{/}, map { &uri_escape($_) }, split q{/}, &path_info();

これはPATH_INFOをスラッシュごとに区切ってURIエスケープしてから、 セパレーターにスラッシュを指定して結合してるんだけど、 だぶんぱっと見ただけでは、分かりづらい。

一行でかけるから書く方は楽なんでけど、他人がこれを管理するとなるとめんどくさそう。 これが十個も続いていたら多分しぬ。

ということで、本日のネタは終了。 なんていうか、初心者向け?

ちなみに、自分もまだ完全にはPerlを理解しきっていなかったりする。