undefDESCRIPTIONこのモジュールはデータとデータ型のためのユーティリティ関数を提供します。ユーティリティはチェック関数群と検証関数群とその他の関数群があります。チェック関数群は値の型を調べ,真偽値を返す機能を提供します。偽であれば致命的エラーとなる機能を提供します。コードリファレンスの操作などの機能を提供します。これらユーティリティはいずれもコードの繰り返しを避けるために設計されました。Perlバックエンドが使用されます。バックエンドを使用することができます。Perlバックエンドより2倍から10倍程度高速に動作します。インラインで展開したコードよりも更に高速です。ディストリビューションのbenchmark/ディレクトリにベンチマークがあります。functionsチェック関数群は:checkインポートタグによって導入できます。型が目的の型であれば真を,そうでなければ偽を返します。これらの関数はオーバーロードマジックも調べます。オーバーロードされているオブジェクトは,スカラーリファレンスとして扱われます。オーバーロードされていない限り常に偽を返します。これは,オブジェクトの実装に依存するコードを書かないようにするためです。is_scalar_ref(value)スカラーリファレンスかどうかのチェックを行います。is_array_ref(value)配列リファレンスかどうかのチェックを行います。is_hash_ref(value)ハッシュリファレンスかどうかのチェックを行います。is_code_ref(value)コードリファレンスかどうかのチェックを行います。is_glob_ref(value)グロブリファレンスかどうかのチェックを行います。is_regex_ref(value)qr//によって作られる正規表現かどうかのチェックを行います。class)classのインスタンスかどうかのチェックを行います。classが未定義値またはリファレンスであれば致命的エラーとなります。is_invocant(value)valueに対してメソッドを起動できるかどうかをチェックします。is_value(value)valueがプリミティブ値かどうかをチェックします。リファレンスではなく,型グロブでもなければ真を返します。オブジェクトリファレンスに対しては常に偽を返します。持っていたとしても,それはプリミティブ値としては判断しません。この関数には検証を行う対応関数がありません。文字列化したときに1文字以上の内容を持つ値かどうかをチェックします。この関数には検証を行う対応関数がありません。is_number(value)valueが数値かどうかをチェックします。Perlプログラム中にリテラルとしておくことができる値という意味です。数値として扱いません。true"も同じ理由で数値として扱いません。この関数には検証を行う対応関数がありません。is_integer(value)valueが整数かどうかをチェックします。整数値かどうかをチェックします。この関数には検証を行う対応関数がありません。functions検証関数は:validateタグによって導入できます。同じ方法でチェックを行います。偽であれば致命的エラーとなります。これらの関数もオーバーロードマジックを考慮します。scalar_ref(value)スカラーリファレンスかどうかの検証を行います。array_ref(value)配列リファレンスかどうかの検証を行います。hash_ref(value)ハッシュリファレンスかどうかの検証を行います。code_ref(value)コードリファレンスかどうかの検証を行います。glob_ref(value)グロブリファレンスかどうかの検証を行います。regex_ref(value)qr//によって作られる正規表現かどうかの検証を行います。class)classのインスタンスかどうかの検証を行います。classが未定義値またはリファレンスであれば致命的エラーとなります。invocant(value)valueに対してメソッドを起動できるかどうかの検証を行います。valueがクラス名である場合,そのクラス名を正規化した文字列を返します。,"::Foo"や"main::Foo"を与えると"Foo"を返します。utilitiesその他,個別にインポートできるいくつかのユーティリティ関数があります。anon_scalar()undefを参照する匿名スカラーリファレンスを生成します。anon_scalar(value)valueのコピーを参照する匿名スカラーリファレンスを生成します。}というコードと等価です。neat(value)valueを表示に適するよう整形した文字列を返します。して提供されますが,より高機能です。存在すれば,そのスタッシュを返します。そのパッケージのスタッシュを返します。...])サブルーチンsubrをpackageにnameとしてインストールします。Perl版のコードでは匿名サブルーチンの命名は行いません)。ディレクティブを使ってください。$subr);packageかnameが未定義値またはリファレンスであれば致命的エラーとなります。オーバーロードマジックは考慮されます。'refs'を必要としないため,strict無効化の誤謬を犯す危険性がありません。strict無効化の誤謬とは,以下のような状況を指します。}これはオブジェクトのプロパティを参照するアクセサを生成するコードです。このアクセサは,正しく使う限りでは問題はありません。このアクセサをクラスメソッドとして呼び出すと,問題が顕在化します。このアクセサが定義されたパッケージのグローバル変数としてデリファレンスされます。これは多くの場合,単にundefを返すだけでしょう。得ることができず,デバッグの難しいコードを生成してしまいます。strictを有効にする必要があります。}そこで,install_subroutine()を使うともstrictを使用する必要がなくなります。...)サブルーチンnameをパッケージpackageから削除します。この挙動はnamespace::cleanやconstant::lexicalを実現するためのものです。以下の二つのコードは等価です。複数のサブルーチンを一度に削除できます。get_code_info(subr)サブルーチンsubrのパッケージと名前のペアを返します。これはSub::Identify::get_code_info()とほぼ同じ機能です。スカラーコンテキストでは完全修飾名を返します。スカラーコンテキストではundefを返します。name)\&package::nameが存在すれば,それを返します。*package::nameを生成しません。スタブを生成してそれを返します。placeholders)サブルーチンsubrのカリー化を行います。特定の引数を固定したクロージャを生成します。置き換えられるプレースホルダを渡します。以下の$closureと$curriedは同じ機能を持つサブルーチンとなります。*_;なお,*_は\xで参照しなかった引数リストではないので注意してください。$_[0](つまり0)が無視されます。カリー化はクロージャよりも生成・呼び出しが高速です。詳しいサンプルコードがData::Util::Curryにあります。無名関数modified_subrとして返します。与えられた引数で呼び出されます。beforeとafterの戻り値は捨てられます。aroundはsubrの入出力をフィルタリングするための修飾子です。(last-defined-first-called),afterは先に定義されたものが先に呼び出されます(first-defined-first-called)。$modified-&gt;();XSによる実装では,サブルーチン修飾子のコストが非常に安くなっています。slower特に,beforeとafterはSUPER::疑似クラスによってメソッドを拡張するよりも高速です。詳しい解説があります。Class::Method::Modifiersにも解説があります。機能には互換性があります。...)modify_subroutine()で生成したmodifiedを操作します。生成されたものかどうかを示す真偽値を返します。渡すと,そのmodifier_typeに応じた修飾関数を返します。その関数を追加します。must_be)inputを元に名前と値のペア配列からなる配列リファレンスを作成します。これはData::OptList::mkopt()に似ています。名前と型のペアからなるハッシュリファレンスでもかまいません。must_be)inputを元にハッシュリファレンスを作成します。これはData::OptList::mkopt_hash()に似ています。名前と型のペアからなるハッシュリファレンスでもかまいません。handling検証関数によって放出される致命的エラーは,Data::Util::Errorモジュールによって変更することができます。...このエラーハンドラはパッケージ毎に設定され,そのパッケージ内でData::Utilが発生させるエラーにはそのエラーハンドラが使われます。X-reference?「Xのリファレンス」とは何を指すのでしょうか。ここではハッシュリファレンスを例にとって考えます。判断要素は以下の3つを想定します。'%{}')ref()は非常に高速なので,実用上はこれで事足りることが多いと思われます。これはオーバーロードマジックを考慮しません。reftype()を使うべきではありません。$xがオブジェクトである場合,オブジェクトの実装型を参照し,カプセル化を壊してしまうことになるからです。overload::Methodが捕捉するのは,オブジェクトをある型のリファレンスとみなしてよい特殊なケースです。直接$xをハッシュリファレンスとみなして参照すること($x->{$key})は避けるべきです。これは$xがハッシュリファレンスでない場合に正しく致命的エラーを発生させますが,ブレスされたハッシュリファレンスのときにはアクセスが成功します。そのアクセスの成功はオブジェクトの実装に依存しています。それではis_hash_ref()は何を調べればいいのでしょうか。回答の一つはParams::Utilが示しています。0.35の時点では,P::U::_HASHは(1)を,P::U::_HASHLIKEは(2)と(3)をチェックします。先に述べたように,(1)は高速ですがオーバーロードマジックを考慮しないので不完全であり,(2)はオブジェクトのカプセル化を壊すため使うべきではありません。このように考えると,is_hash_ref()は(1)と(3)によるチェックを行うのが正しい実装ということになります。したがって,is_hash_ref()ではref()とoverload::Method()を使ってリファレンスの型を調べます。is_scalar_ref(),is_array_ref(),is_code_ref(),is_glob_ref()も同様です。Perl版のバックエンドが使われます。最適化したものであり,またいくつかはそれに加えて更に拡張を施したものです。