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