perlのヒアドキュメント中での変数の扱いについて

http://memo.hirosiki.jp/article/63534247.html

で使われている

@{[ do { $var; } ]} 

について。
これは、配列のリファレンスをデリファレンスしてる。


まず、一番内側のdoブロックはコードブロック内からリストを返すことを期待している。
do を使ってるのは、無名ハッシュのコンストラクタと扱われないようにするため?

print do { (1,2,3) } #-> 123


この返されたリストを、無名配列のコンストラクタ([])で無名配列化して、リファレンスを
返す。

print [do { (1,2,3) }] #-> ARRAY(0x10010f08)


最後に、そのリファレンスをブロックにつっこんで、ブロックが返すリファレンスを'@'で配列にデリファレンス

print @{[do { (1,2,3) }]} #-> 123


do{}ブロックは、ブロック内部に自由にコードを書けるようにするための仕組みなので、
単に一発サブルーチンを呼ぶだけでOKなら、do{}とかせずに、サブルーチンを直接呼び出せばOK。

sub hello() {
    "Hello, World!"
}
print @{[hello()]} #-> Hello, World!


参考:
http://perl-users.jp/articles/advent-calendar/2008/14.html
Effective Perl (ASCII Addison Wesley Programming Series)のP130