unless’s blog

日々のちょっとした技術的なことの羅列

Perlのmapでハマった話

少し考えればすぐわかることだがハマってる時はぜんぜん気がつかずに困ってたのでメモ

#!/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.

こういうのハマってるときはマジで全然気がつかないものだよな...
めちゃめちゃ時間を不毛に使ったわ...