WEB 上に正解をみつけられなかったので、実際のコードをテストして検証しましたが、以下のコードで良いと思います。( 二回呼び出して二回目に初期化が処理されないのを確認しました ) このメッセージは『非推奨』を意味しますが、それらの内容や対処方法はこちらを参考にしています defined(%hash) is deprecated (D deprecated) defined() は未定義の スカラ 値を調べるので、ハッシュに 使っても普通は無意味です。 ハッシュが空かどうかを調べたい場合は、例えば単に if (%hash) { # not empty } としてください。 sub z2h_euc { local(*s, $n) = @_; if ( !%z2h_euc ) { &init_z2h_euc; } # &init_z2h_euc unless defined %z2h_euc;