関数の中でwantarrayを使っているときは要注意
関数の返却値をそのまま、ハッシュの値に詰め込んだ場合、リストコンテキストとなるんですなぁ。ハッシュは配列の一種だから当然なんですが・・・ 以下のソースを見るとよくわかります。
use strict; use warnings; use Data::Dumper; sub test(){ wantarray? (1,2):1; } my $hoge = { aaa=> test()}; print Dumper($hoge); $hoge = { aaa=> scalar test()}; print Dumper($hoge);
で、結果。
$ perl test.pl
Odd number of elements in anonymous hash at test.pl line 9.
$VAR1 = {
'aaa' => 1,
'2' => undef
};
$VAR1 = {
'aaa' => 1
};
普通に動かすと1、2がそのまま配列に入っていってしまう。
昨日のブログでは Geo::Lineのpoints()関数の中にwantarrayが入っていまして。 リストコンテキストでは配列のリファレンスの配列が返ってくるので おかしな結果となってしまったというわけ。 scalarを入れてやれば、{配列のリファレンスの配列}のリファレンスが 返るようになるから思った動きになってくれるというわけでした。
とても、いい勉強になりました。