私も気になっていたので、よく眺めてみました。
map{($_ => 1)}@hoge1
の部分は、@hoge1の配列要素をキーに値を1として連想配列を初期化している。
($_ => 1) の ()は不要だろう。なぜなら、
{map{$_ => 1}@hoge1}
で、無名ハッシュへのリファレンスとなる。
${{map{$_ => 1}@hoge1}}{KEY}
で、KEYの要素について無名ハッシュをデリファレンスする。
grep{${{map{$_ => 1}@hoge1}}{$_}}@hoge2
は、@hoge2の各要素をキーとして、@hoge1の配列要素をキーとした無名ハッシュ
を真偽評価してgrepすることになる。従って、@hoge1の配列要素を一つずつ、
@hoge2の配列要素に等しいものがあるかどうかを確かめ、等しいものがある場合
にその要素を出力する。
と解釈できると思いましたです。
--
藤岡
On Sun, 15 Aug 2004 22:41:49 +0900
dune <FZH01112@...> さんwrote:
> 王虎 さんの [TSperl:425] 配列の積と差 から
> >2ちゃんねるのPerlスレで見かけたのですが、配列(リスト)の積と
> >差を求めるのに以下のような手法が挙げられていました。
>
> 2ch は見ずに「配列の積」と「配列の和」ってなんだろう?
> スカラー積でもなさそうだしなぁ、というところで思考停止して
> ました。今日まじめに見てやっとわかった。
>
> >print grep{${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
>
> @hoge2 の要素の数だけ %{{map{($_ => 1)}@hoge1}} が実行
> される(作っては捨てられを繰り返す)のがイヤらしいので、
> $c = { map{($_=>1)} @hoge1 }; として再利用するように、
>
> print grep{${$c||={map{($_=>1)}@hoge1}}{$_}}@hoge2;
>
> とするならいいかな。わかりやすくなって面白味が減るけど。
>
> --
> 極悪, FZH01112 at nifty.com
> http://hpcgi1.nifty.com/dune/gwiki.pl?
藤岡 和夫
FGALTS@...
kazuf@...
TS Networkのために http://homepage1.nifty.com/kazuf/