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に限って言えば、どちらでも良いようだ。