12月に入ってAdvent Calenderの記事を追うだけで
一日が終わってしまいそうな今日この頃。
ゲーム開発におけるマスターデータの管理方法に関する記事をちらほら目にします。
narazaka.blog109.fc2.com tech.drecom.co.jp
(と思ったらどっちもドリコムさんの記事だった。)
マスターデータはDirが丹精込めて作ったもの、でもお手製ゆえ当然ミスもあります。
そんなミスを極力なくすために
pgがマスターデータ用のテストを用意していることが多いはず。
そのパターンは無数ですが、
この間たまたまあるマスターデータ関連のテストをレビューしている際に
perlにおけるexists
とdefined
の用法用量がごっちゃになってしまい、
あたふたしたので今日は簡単にここにまとめて復習。
すっごい適当なスクリプトをかいてみました。
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も読んでおきましょう。
ハッシュの要素に対して用いると、value が定義されているか否かを 返すものであって、ハッシュに key が存在するか否かを返すのではありません。 この用途には、exists を使ってください。
なるほどですね。
懐かしい画像。