鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

関数の中で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を入れてやれば、{配列のリファレンスの配列}のリファレンスが 返るようになるから思った動きになってくれるというわけでした。

とても、いい勉強になりました。