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

読了まで:約1分


本日は 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 );

ただし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 を理解しきっていなかったりする。

追記 (2006-09-14-20:13:00+09: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 };

でもできるみたいです。詳しくはコメント欄参照 (NOTE: コメントは 2017 年現在、消失しています)

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。