少し考えればすぐわかることだがハマってる時はぜんぜん気がつかずに困ってたのでメモ
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub get_array_ref { my $func = sub { return undef; }; my @array = undef; my $array_ref = [map { $func->($_) } @array]; return $array_ref; } my $res = get_array_ref(); die '$res does not exist.' unless @$res; print Dumper 'success'; print Dumper $res;
こんな感じの処理があったとして
個人的には get_array_ref
の結果がない時は die
されることを期待していたんだけど
mapを挟んだことによって $array_ref
にの中身が [undef]
になることで
ポインタが作成されて意図した動きになっていなかった
実行結果
perl map.pl $VAR1 = 'success'; $VAR1 = [ undef ];
なのでこんな感じにしてやればよかったみたい
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub get_array_ref { my $func = sub { return undef; }; my @array = undef // (); my $array_ref = [map { $func->($_) } @array]; return $array_ref; } my $res = get_array_ref(); die '$res does not exist.' unless @$res; print Dumper 'success'; print Dumper $res;
実行結果
perl map.pl $res does not exist. at map.pl line 18.
こういうのハマってるときはマジで全然気がつかないものだよな...
めちゃめちゃ時間を不毛に使ったわ...