|
NAMEData::Util::JA - データとデータ型のためのユーティリティ集VERSIONThis document describes Data::Util version 0.63SYNOPSISuse Data::Util qw(:validate); sub foo{ # they will die if invalid values are supplied my $sref = scalar_ref(shift); my $aref = array_ref(shift); my $href = hash_ref(shift); my $cref = code_ref(shift); my $gref = glob_ref(shift); my $rref = regex_ref(shift); my $obj = instance(shift, 'Foo'); # ... } use Data::Util qw(:check); sub bar{ my $x = shift; if(is_scalar_ref $x){ # $x is an array reference } # ... elsif(is_instance $x, 'Foo'){ # $x is an instance of Foo } # ... } # miscelaneous use Data::Util qw(:all); my $x = anon_scalar(); $x = anon_scalar($x); # OK my $stash = get_stash('Foo'); install_subroutine('Foo', hello => sub{ "Hello!\n" }, goodby => sub{ "Goodby!\n" }, ); print Foo::hello(); # Hello! my($pkg, $name) = get_code_info(\&Foo::hello); # => ('Foo', 'hello') my $fqn = get_code_info(\&Foo::hello); # => 'Foo::Hello' my $code = get_code_ref($fqn); # => \&Foo::hello uninstall_subroutine('Foo', qw(hello goodby)); print neat("Hello!\n"); # => "Hello!\n" print neat(3.14); # => 3.14 print neat(undef); # => undef DESCRIPTIONこのモジュールはデータとデータ型のためのユーティリティ関数を提供します。ユーティリティはチェック関数群と検証関数群とその他の関数群があります。 チェック関数群は値の型を調べ,真偽値を返す機能を提供します。 検証関数群は値の型を調べ,真であればその値自身を返し, 偽であれば致命的エラーとなる機能を提供します。 その他の関数群は,無名スカラーリファレンスの生成やシンボルテーブルの操作, コードリファレンスの操作などの機能を提供します。 これらユーティリティはいずれもコードの繰り返しを避けるために設計されました。 このモジュールはXSとPure Perl双方で実装されており,Cコンパイラのある 環境ではXSバックエンドが,ない環境ではPure Perlバックエンドが使用されます。 なお,環境変数"DATA_UTIL_PUREPERL"を真に設定することで,強制的にPure Perl バックエンドを使用することができます。 XSバックエンドは注意深く実装されており, Pure Perlバックエンドより2倍から10倍程度高速に動作します。 実際,XSバックエンドが提供するほぼ全ての関数は,等価のPure Perlコードを インラインで展開したコードよりも更に高速です。 ディストリビューションのbenchmark/ディレクトリにベンチマークがあります。 INTERFACECheck functionsチェック関数群は":check"インポートタグによって導入できます。これらはある値 の型が目的の型であれば真を,そうでなければ偽を返します。また,これらの関数はオーバーロードマジックも調べます。たとえば,"${}"が オーバーロードされているオブジェクトは,スカラーリファレンスとして扱われます。 リファレンスの型チェックをする関数は,オブジェクトリファレンスに対しては, オーバーロードされていない限り常に偽を返します。 これは,オブジェクトの実装に依存するコードを書かないようにするためです。
Validating functions検証関数は":validate"タグによって導入できます。これらはチェック関数と 同じ方法でチェックを行います。 ただし,その結果が真であれば第一引数をそのまま返し, 偽であれば致命的エラーとなります。これらの関数もオーバーロードマジックを考慮します。
Micellaneous utilitiesその他,個別にインポートできるいくつかのユーティリティ関数があります。
Error handling検証関数によって放出される致命的エラーは,"Data::Util::Error"モジュールによって変更することができます。package Foo; use Data::Util::Error sub{ Foo::InvalidArgument->throw(@_) }; use Data::Util qw(:validate); # ... このエラーハンドラはパッケージ毎に設定され,そのパッケージ内で"Data::Util"が発生させるエラーにはそのエラーハンドラが使われます。 DISCUSSIONSWhat is a X-reference?「Xのリファレンス」とは何を指すのでしょうか。ここではハッシュリファレンスを例にとって考えます。 まず,判断要素は以下の3つを想定します。
"ref()"は非常に高速なので,実用上はこれで事足りることが多いと思われます。しかし,これはオーバーロードマジックを考慮しません。 "reftype()"を使うべきではありません。$xがオブジェクトである場合,オブジェクトの実装型を参照し,カプセル化を壊してしまうことになるからです。 そして"overload::Method"が捕捉するのは,オブジェクトをある型のリファレンスとみなしてよい特殊なケースです。 なお,直接$xをハッシュリファレンスとみなして参照すること("$x->{$key}")は避けるべきです。これは$xがハッシュリファレンスでない場合に正しく致命的エラーを発生させますが,ブレスされたハッシュリファレンスのときにはアクセスが成功します。しかし,そのアクセスの成功はオブジェクトの実装に依存しています。 さて,それでは"is_hash_ref()"は何を調べればいいのでしょうか。回答の一つは"Params::Util"が示しています。Version 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()"も同様です。 ENVIRONMENT VARIABLESDATA_UTIL_PUREPERL真であれば,Pure Perl版のバックエンドが使われます。DEPENDENCIESPerl 5.8.1 or later.BUGS AND LIMITATIONSNo bugs have been reported.Please report any bugs or feature requests to the author. SEE ALSOoverload.Scalar::Util. Class::MOP. このモジュールのいくつかの機能は以下のモジュールの機能をXSに移植して 最適化したものであり,またいくつかはそれに加えて更に拡張を施したものです。 Params::Util. Sub::Install. Sub::Identify. Sub::Delete. Sub::Curry. Class::Method::Modifiers. Data::OptList. AUTHORGoro Fuji (gfx) <gfuji(at)cpan.org>LICENSE AND COPYRIGHTCopyright (c) 2008-2009, Goro Fuji (gfx) <gfuji(at)cpan.org>. Some rights reserved.This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Visit the GSP FreeBSD Man Page Interface. |