Man pages sections > man3 > Data::Util::JA

Data::Util::JA - XXXXXXXXXXXXXXXXXXXX

Data::Util::JA(3pm) User Contributed Perl Documentation Data::Util::JA(3pm)

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)
invocantXXXXXX 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.10 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> 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.
2017-08-26 perl v5.26.0