ref関数〜変数の型を確認したい〜

ref関数は、引数によって真か偽かを返す関数です。

■引数がリファレンスの場合
「真」つまり、リファレンスが参照する型を返します。
なお、返す型は以下です。

・SCALAR   スカラー
・ARRAY    配列
・HASH    ハッシュ
・REF     リファレンス
・CODE    サブルーチン
・パッケージ名 blessされているもの
・GLOB    型グロブ

■引数がリファレンスでない場合
「偽」を返します。

こんな感じで使います。

■処理内容
#$kをハッシュのキーに、$vをハッシュの値(value)として%paramsに追加していきたい。
#$kがすでに存在しているキーの場合、値(value)を配列のリファレンスにして$vを入れる
#つまり、キーの重複によるvalueの上書きはしない

■スクリプト
#$kがすでにハッシュのキーとして存在していなければ普通にキー、valueとして追加
if (!exists($params{$k})){
    $params{$k} = $v;

#$kのvalueが、配列のリファレンスになっていなければ配列のリファレンスにして$vを追加
}elsif(!ref $params{$k}){
    $params{$k} = [$params{$k}, $v];
                                                                            
#$kのvalueがすでに配列のリファレンスになっている場合、そのまま$vを追加
}else{
    push @{$params{$k}}, $v;
}

ref関数を使用してはまったら、まず、ref関数に渡している引数がリファレンスかどうかをよく確認してみてください。

私は、リファレンスでないスカラー変数をrefの引数に与え、どーしてSCALARが返らないのだっ!、とはまりにはまりました。脳みそが煮えたので、先輩に聞くとあっさり。。。はまって自分で抜け出せないのは、ものすごくくやしい。