Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

PerlのHashでキーの存在確認、キーの値の存在確認

12月に入ってAdvent Calenderの記事を追うだけで
一日が終わってしまいそうな今日この頃。

ゲーム開発におけるマスターデータの管理方法に関する記事をちらほら目にします。

narazaka.blog109.fc2.com tech.drecom.co.jp

(と思ったらどっちもドリコムさんの記事だった。)

マスターデータはDirが丹精込めて作ったもの、でもお手製ゆえ当然ミスもあります。

そんなミスを極力なくすために
pgがマスターデータ用のテストを用意していることが多いはず。

そのパターンは無数ですが、
この間たまたまあるマスターデータ関連のテストをレビューしている際に
perlにおけるexistsdefinedの用法用量がごっちゃになってしまい、
あたふたしたので今日は簡単にここにまとめて復習。

すっごい適当なスクリプトをかいてみました。

use strict;
use warnings;

my $onsen;

$onsen = {
    inoue    => {
        home => "saitama",
        age => "22",
        like => "Heros"
    },
    ito      => {
        home => "kanagawa",
        age => "21",
        like => "koke"
    },
    nakamoto => {
        home => "hiroshima",
        age => "21",
        like => "Dance"
    }
};

while ( my ($name, $data) = each(%{$onsen}) ) {
    my ($home, $age, $like) = (
            $data->{home},
            $data->{age},
            $data->{like}
        );

    print $name . "\n";
    print "home: " . $home . "\n";
    print "age: " . $age . "\n";
    print "like: " . $like . "\n";
    print "-----------------\n";
}

print "action: 伊藤万理華のコケ時代はとっくに終わってる(о´∀`о)\n";
undef ($onsen->{ito}->{like});
# ito => {home => "kanagawa",age => "21", like => undef}

if(exists $onsen->{ito}->{like}) {
    print "exists : 趣味の欄自体は残っている\n";
}
if(!defined $onsen->{ito}->{like}) {
    print "not defined : その内容は定義されていない\n";
}

print "action: 伊藤・中元はこの秋に卒業しちゃったよ( ;∀;)\n";
delete ($onsen->{ito});
delete ($onsen->{nakamoto});

if(!exists $onsen->{ito} && !exists $onsen->{nakamoto}) {
    print "not exist : 伊藤・中元のキー自体削除された\n";
}

【実行結果】

$ perl exists_or_defined.pl

nakamoto
home: hiroshima
age: 21
like: Dance
-----------------
ito
home: kanagawa
age: 21
like: koke
-----------------
inoue
home: saitama
age: 22
like: Heros
-----------------

action: 伊藤万理華のコケ時代はとっくに終わってる(о´∀`о)`
exists : 趣味の欄自体は残っている
not defined : その内容は定義されていない

action: 伊藤・中元はこの秋に卒業しちゃったよ( ;∀;)
not exist : 伊藤・中元のキー自体削除された

ポイントは...
- ハッシュのキー自体が存在しているのか
あるいは
- ハッシュのキーの値が存在しているのか
で使い方が異なるという点。

perldoc.jp

perldocも読んでおきましょう。

ハッシュの要素に対して用いると、value が定義されているか否かを 返すものであって、ハッシュに key が存在するか否かを返すのではありません。 この用途には、exists を使ってください。

なるほどですね。

f:id:taiga006:20171209231648p:plain

懐かしい画像。