NAME¶
Data::Util::JA - XXXXXXXXXXXXXXXXXXXX
VERSION¶
This document describes Data::Util version 0.63
SYNOPSIS¶
use 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¶
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXSXPure PerlXXXXXXXXXXXCXXXXXXXX XXXXXSXXXXXXXXXXXXXXPure
PerlXXXXXXXXXXXXXX XXXXXXX"DATA_UTIL_PUREPERL"XXXXXXXXXXXXXXXPure
Perl XXXXXXXXXXXXXXXXXXX
XSXXXXXXXXXXXXXXXXXXX Pure PerlXXXXXXXX2XXX10XXXXXXXXXXXX
XXXXSXXXXXXXXXXXXXXXXXXXXXXXPure PerlXXXX XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
benchmark/XXXXXXXXXXXXXXXXXXX
INTERFACE¶
Check functions¶
XXXXXXXX":check"XXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"${}"X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- is_scalar_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXXXX
- is_array_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXX
- is_hash_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXXXX
- is_code_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXXX
- is_glob_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXXX
- is_regex_ref(value)
- "qr//"XXXXXXXXXXXXXXXXXXXXXXXXXXX
- is_instance(value, class)
- classXXXXXXXXXXXXXXXXXXXXXX
"Scalar::Util::blessed($value) &&
$value->isa($class)"XXXXXXX XXXXXXX
classXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- is_invocant(value)
- valueXXXXXXXXXXXXXXXXXXXXXXXXXXX
- is_value(value)
- valueXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXX(XXX"is_string"/"is_number()"/"is_integer()")XX
XXXXXXXXXXXXXXXXXXXXXXXXXX XXX valueXXXXX/XXX/XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX
- is_string(value)
- valueXXXXXXXXXXXX XXXXXXXXXXX1XXXXXXXXXXXXXXXXXXXXXXXX
"do{ is_value($value) && length($value) > 0 }"XXXXXX
XXXXXXXXXXXXXXXXXXXXXX
- is_number(value)
- valueXXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXX(XXXX"sprintf
'%g', $value"X XXXXXXXXXXXXXXXXXXX
XXPerlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX"Scalar::Util::looks_like_number()"XXXXX
"Infinity"X"NaN"XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "0 but true"XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX
- is_integer(value)
- valueXXXXXXXXXXXXXXXXXXX"is_number()"XXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX
Validating functions¶
XXXXX":validate"XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
- scalar_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXX
- array_ref(value)
- XXXXXXXXXXXXXXXXXXXXX
- hash_ref(value)
- XXXXXXXXXXXXXXXXXXXXXXX
- code_ref(value)
- XXXXXXXXXXXXXXXXXXXXXX
- glob_ref(value)
- XXXXXXXXXXXXXXXXXXXXXX
- regex_ref(value)
- "qr//"XXXXXXXXXXXXXXXXXXXXXXXXX
- instance(value, class)
- classXXXXXXXXXXXXXXXXXXXX
classXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- invocant(value)
- valueXXXXXXXXXXXXXXXXXXXXXXXXXXX
valueXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX"::Foo"X"main::Foo"XXXXX"Foo"XXXXXX
Micellaneous utilities¶
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- anon_scalar()
- "undef"XXXXXXXXXXXXXXXXXXXXXXXX
- anon_scalar(value)
- valueXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX"do{ my $tmp = $value; \$value; }"XXXXXXXXXXXX
- neat(value)
- valueXXXXXXXXXXXXXXXXXXXXXX "do{ defined($value) ?
qq{"$value"} : 'undef' }"XXXXXXXX XXXXXXXXXXXXXXXXXXX
- get_stash(invocant)
- invodantXXXXXX stashXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX
invocantXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX
invocantXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX
- install_subroutine(package, name => subr [, ...])
- XXXXXXsubrXpackageXnameXXXXXXXXXXXXX
"do{ no strict 'refs'; *{$package.'::'.$name} = \&subr;
}"XXXXXXX XXXXXXXXXXX subrXXXXXXXXXXXXXXpackageX
XXXXXXXXXX &package::nameXXXXXXXX(XXXXPure
PerlXXXXXXXXXXXXXXXXXXXXXXXX)X
XXXXXXXXXXXXXXXXXXXX"no warnings 'redefine'" XXXXXXXXXXXXXXXX
no warnings 'redefine';
install_subrouitne($package, $name => $subr);
packageXnameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
subrXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX
XXXXX"no strict 'refs'"XXXXXXXXXX
strictXXXXXXXXXXXXXXXXXXXstrictXXXXXXXXXXXXXXXXXXXXXXX
my $property = ...;
# ...
no strict 'refs';
# simple read-only accessor
*{$pkg . '::' . $sub_name} = sub{
my($self) = @_;
return $self->{$property};
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXX$selfXXXXXXXXXXXXXXXXXXXXX
"$self->{$property}"XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXX"undef"XXXXXXXXXX "<use strict
'refs'">XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXstrictXXXXXXXXXXXXXXXXXXXXXXXXX "use strict"XXXXXXXXXXXXXX
no strict 'refs';
*{$pkg . '::' . $sub_name} = sub{
use strict 'refs';
my($self) = @_;
return $self->{$property};
}
XXXX"install_subroutine()"XXXXX"strict"XXXXXXXXXXXXXXX
install_subroutine $pkg => (
$sub_name => sub{
my($self) = @_;
return $self->{$property};
},
);
XXstrictXXXXXXXXXXXX"18.10" in "PerlXXXXXXXXX"
XXXXXXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXX
- uninstall_subroutine(package, name [=> code], ...)
- XXXXXXnameXXXXXXpackageXXXXXXXX
"undef &subr"X&subrXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXX"uninstall_subroutine"XXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXX
XXXXX"namespace::clean"X"constant::lexical"XXXXXXXXXXXXX
nameXXXXcodeXXXXXXXXXXXX&package::nameXcodeXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uninstall_subroutine($pkg, $name) if \&{$pkg . '::' . $name} == $code;
uninstall_subroutine($pkg, $name => $code);
XXXXX"Sub::Delete::delete_sub()"XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX
- get_code_info(subr)
- XXXXXXsubrXXXXXXXXXXXXXXXXXX
XXX"Sub::Identify::get_code_info()"XXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX
subrXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX"undef"XXXXXX
- get_code_ref(package, name)
- \&package::nameXXXXXXXXXXXXXXX XXX"do{ no strict 'refs';
*{$package . '::' . $name}{CODE} }" XXXXXXXX
\&package::nameXXXXXXXXXX *package::nameXXXXXXXX
XXXXXXX"-create"XXXXXX \&package::nameXXXXXXXX
XXXXXXXXXXXXXXXX XXX"do{ no strict 'refs'; \&{$package . '::' .
$name} }"XXXXXX
- curry(subr, args and/or placeholders)
- XXXXXXsubrXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXX
args and/or placeholdersXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX xXXX
XX"\x"XX"\x"XXXXXXXXXXXXXXXXXXXXXXXXX *_XXXXXX
XXXXXXXX$closureX$curriedXXXXXXXXXXXXXXXXXXXX
my $class = 'Foo';
$closure = sub{ is_instance($_[0], $class) };
$curried = curry \&is_instance, \0, $class;
$closure = sub{ install_subroutine($class, @_) };
$curried = curry \&install_subroutine, $class, *_;
XXX*_X"\x"XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX"curry(\&subr, *_, \1)->(0, 1, 2, 3)"XXXXXXXXXX
"subr(2, 3, 1)"XXXXXXXXXXXXXXXXXXXXXXXXXX $_[0](XXX0)XXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXData::Util::CurryXXXXXX
- modify_subroutine(subr, modifier_type => [subroutines], ...)
- XXXXXXsubrXmodifier_typeXXXXXXsubroutinesXXXXX XXXX
modified_subrXXXXXXXX
modifier_typeXX"before", "around",
"after"XXXX"before"X
subrXXXXXXXX"after"X
subrXXXXXXXmodified_subrX
XXXXXXXXXXXXXXXX"before"X"after"XXXXXXXXXXXX
"around"X subrXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX"before"X"around"XXXXXXXXXXXXXXXXXX
(last-defined-first-called)X"after"XXXXXXXXXXXXXXXXXXXX(first-defined-first-called)XXXXXXXXX"subroutine_modifier()"XXXX
XXX
XXXXX
$modified = modify_subroutine(\&foo, around => [sub{
my $next = shift;
do_something();
goto &{$next}; # continuation
}]);
$modified->();
$modified = modify_subroutine(\&foo,
before => \@befores,
around => \@arounds,
after => \@afters,
);
$modified->();
XSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX example/lib/Method/Modifiers.pm
("modify_subroutine()"/"subroutine_modifier()"XXX)XXXXXXX
benchmark/methext_bench.plXXXXXXXXXXXXXXXXXXXXXXXXXXXX
with before modifier: 100% slower
with after modifier: 100% slower
with around modifier: 200% slower
XXX"before"X"after"X"SUPER::"XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXX"Method Modifiers" in Class::MOP::ClassX
XXXXXXXXXXXClass::Method::ModifiersXXXXXXXXXX
XXXXXXXXXXXXAPIXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXX
- subroutine_modifier(modified, modifier_type => subroutines, ...)
- "modify_subroutine()"XXXXXmodifiedXXXXXXX
XXX
modifiedXXXXXXXXXXXmodifiedX"modify_subroutine()"X
XXXXXXXXXXXXXXXXXXXXXXX
if(subroutine_modifier $subr){
# $subrXXXXXXXXXXXX
}
modifiedXmodifier_type("before",
"around", "after") XXXXXXX
modifier_typeXXXXXXXXXXXXXX
@befores = subroutine_modifier $modified, 'before';
XXXXXXXXXXXXXXXXXXXXXX modifiedXmodifier_typeX XXXXXXXXXXX
subroutine_modifier $modified, before => @befores;
- mkopt(input, moniker, require_unique, must_be)
- inputXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX"Data::OptList::mkopt()"XXXXXXXXXXXXXX must_beX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
For example:
$array_ref = mkopt([qw(foo bar), baz => [42]], 'moniker');
# $array_ref == [ [foo => undef], [bar => undef], baz => [42] ]
- mkopt_hash(input, moniker, must_be)
- inputXXXXXXXXXXXXXXXXXXXX
XXX"Data::OptList::mkopt_hash()"XXXXXXXXXXXXXX must_beX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
For example:
$hash_ref = mkopt([qw(foo bar), baz => [42]], 'moniker');
# $hash_ref == { foo => undef, bar => undef, baz => [42] }
Error handling¶
XXXXXXXXXXXXXXXXXXXXX"Data::Util::Error"XXXXXXXXXXXXXXXXXXXXX
package Foo;
use Data::Util::Error sub{ Foo::InvalidArgument->throw(@_) };
use Data::Util qw(:validate);
# ...
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"Data::Util"XXXXXXXXXXXXXXXXXXXXXXXXXXX
DISCUSSIONS¶
What is a X-reference?¶
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXX3XXXXXXXX
- 1.
- "ref($x) eq 'HASH'"
- 2.
- "Scalar::Util::reftype($x) eq 'HASH'"
- 3.
- "overload::Method($x, '%{}')"
"ref()"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
"reftype()"XXXXXXXXXXXXX$xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX"overload::Method"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX$xXXXXXXXXXXXXXXXXXXXXXX("$x->{$key}")XXXXXXXXXXXX$xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXX"is_hash_ref()"XXXXXXXXXXXXXXXXXXXXXX"Params::Util"XXXXXXXXVersion
0.35XXXXXX"P::U::_HASH"X(1)XX"P::U::_HASHLIKE"X(2)X(3)
XXXXXXXXXXXXXXXXXXXXX(1)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(2)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"is_hash_ref()"X(1)X(3)XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXX"is_hash_ref()"XX"ref()"X"overload::Method()"XXXXXXXXXXXXXXXXXX"is_scalar_ref()"X"is_array_ref()"X"is_code_ref()"X"is_glob_ref()"XXXXXX
ENVIRONMENT VARIABLES¶
DATA_UTIL_PUREPERL¶
XXXXXXPure PerlXXXXXXXXXXXXXXX
DEPENDENCIES¶
Perl 5.8.1 or later.
BUGS AND LIMITATIONS¶
No bugs have been reported.
Please report any bugs or feature requests to the author.
SEE ALSO¶
overload.
Scalar::Util.
Class::MOP.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXSXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Params::Util.
Sub::Install.
Sub::Identify.
Sub::Delete.
Sub::Curry.
Class::Method::Modifiers.
Data::OptList.
AUTHOR¶
Goro Fuji (gfx) <gfuji(at)cpan.org>
LICENSE AND COPYRIGHT¶
Copyright (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.