2006/07/28(金)map関数の使い方
perl の map 関数の使い方
map関数の説明は他を参照してもらうとして。
$categories->[n] = { cat_ID => カテゴリID, cat_name => カテゴリ名 }; $post2cat->[n] = { post_id => 記事ID, category_id => カテゴリID };
という2つのハッシュリファレンスからなる配列があったとき、記事ID→カテゴリ名という変換テーブル(ハッシュ)を作る方法。
my %cat2name = map { $_->{cat_ID} => $_->{cat_name} } @categories; my %post2name = map { $_->{post_id} => $cat2name{ $_->{category_id} } } @post2cat;
とすると、$post2name{記事ID} → カテゴリ名となります。でもこの場合、@post2cat の最後に出た要素が優先されるので、最初に出た要素を優先するために、
map { $post2name{ $_->{post_id} } ||= $cat2name{ $_->{category_id} } } @post2cat;
と書けます。
foreach(@ary) で回してるものは、mapに置き換えた方がスマートかつ効率的かも知れもません。
grep
grepは別に正規表現なだけではなく、格納条件を指定することもできるらしい。
my @newary = grep { $_ > 100 } @ary;
は
my @newary; foreach(@ary) { if ($_ > 100) { push(@newary, @ary); } }
と等価らしい。grep コマンドの印象が強かったから全然気づかなかった。
追記
んー便利だ。今まで foreach(@ary) で書いてたところが、いくつも書き直せそうだけど……まぁいいや。*1
とりあえず、まだ知らないことがありそうなのでPerl5の関数リストでも眺めておこう。