Perlの不思議な記法

Perlは、Web業界では古くからよく使われて来た言語なのですが、仕様が古いこともあり、
今見るとちょっとよく分からない場合があります。

今回、MTのソースコードを呼んでいて、Object.pmに以下のような記述がありました。

        @{ $props->{child_classes} }{@$classes} = ();

これはどういう意味なのだろうか、、、。まず、@{ }は、デリファランスだと思うんですよね。
つまり、$aが配列への参照だとすると、@{ $a }が配列への実体になる。

ということは、@{ $props->{child_class} }が配列を表していて、ではその次の{@$classes}は
どういう意味なのか?
ここでつまりました。

が、これをどうやって検索してよいかも分からず、そのままじっと見ていて気づいたのですが、
これより一行上を見ると、なんと

        $props->{child_classes} = {};

となっているではありませんか!
 $props->{child_classes}は配列への参照ではなく、連想配列への参照?
 では、@{ $props->{child_class} }は?

 まだよく分からないのですが、@{ $props->{child_class} }{ @$classes }で、$classesの各要素を
キーとする連想配列にまとめて代入、といった扱いになるようです。

 PHPで書き直すのであれば、

	foreach ($classes as $c) {
		$props["child_classes"][$c] = null;
	}

こんな感じ。

やっぱり、perlは難しいです、、、。


参考サイト:
http://d.hatena.ne.jp/yutakikuchi/20120604/1338766462
を読む限りでは、上のPHPと同様のことを実行するには、perlでは本来は

        @{ $props->{child_classes} }{@$classes} = () x @a;

のはず。

でも、ただの()と、() x @aは、同じになるようだ。

そのとき、$props->{child_classes}の各要素は、すべてundefになる。もしも、undefじゃなくて、1とか、ちゃんとした値を入れたい場合は

        @{ $props->{child_classes} }{@$classes} = (1) x @a;

が正しく

        @{ $props->{child_classes} }{@$classes} = (1);

ではダメなのだが、undefに限って言えば、どちらでも良いようだ。