本日は 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 );
ただしmap
やsplit
やgrep
なんかを続けすぎるとわけわかめな暗号文になる。
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 年現在、消失しています)