perlメモ:リファレンス値が表示されてしまう時の対処

perlでRSSとかrest構造のデータとかをXML::Simpleモジュールを使ってXMLinとかでパースして表示する事が有りますが、下の様にハッシュの内容を表示しようとするとリファレンス値が表示される場合があります。これは大抵、RSSやrest構造のデータに元々値が入っていない、つまり空の状態の時に発生します。

rest構造をパースして結果を表示した時

print "$data{'name'}\n;

出力は本来だとこうなって欲しいところだが

R・田中一郎

名前のデータが空だった時の場合

print "$data{'name'}\n;

表示しようとするとこうなっちゃったりする

HASH(0x84ce46c) 

そういうわけで、そういう場合、表示するデータを空にするとか、”無し”とか代わりの文字を表示したりしたいわけですが、そういう場合どうやってハッシュの内容が空というかリファレンス値かどうかを判定する方法ですが、間違うとexistsとかdefinedを使っちゃいますが(俺のことw)正解はrefです。
refはリファレンス値かどうかを判定する関数なのでこれでばっちり判定可能です。

refは値がリファレンス値であれば真を返す。

空の値が来る可能性があるデータはあらかじめリファレンス値かどうかチェックする様にする

if(ref($data{'name'})){
$data{'name'} = '空ですよ。' :
}
print "$data{'name'}\n;

そうすれば値がリファレンス値の場合空白を表示したり代替の文字を表示する事が可能。

空ですよ。

●2008.04.19追記

嘘を書いていたので、修正。

ref関数がリファレンス値なら真を返すと書いたのは嘘です。

実際には下の様なリファレンスの型を返します。

REF
SCALAR
ARRAY
HASH
CODE
GLOB

if(ref($data{‘name’}) eq ‘ARRAY’){

    print “ARRAY型のリファレンス値です。\n”;

}

みたいな事ができるわけです。

●ref – find out the type of thing being referenced
http://www.perl.com/doc/manual/html/pod/perlfunc/ref.html

タグ :