NAME

Hub::Perl::Language -

SYNOPSIS

DESCRIPTION

PUBLIC METHODS

sizeof

Integer size of hashes, arrays, and scalars
Usage: sizeof \%hash
Usage: sizeof \@array
Usage: sizeof \$scalar_ref
Usage: sizeof $scalar
Usage: sizeof \%more, \@than, $one

Sizes are computed as follows:

HASH    - Number of keys in the hash
ARRAY   - Number of elements
SCALAR  - Length as returned by C<length()>

The total size of all arguments is returned.

Example: Hash: (matches)

sizeof( { a=>1, b=>2, c=>3 } );


3

Example: Array: (matches)

sizeof( [ 'a1', 'b2', 'c3' ] );


3

Example: Scalar: (matches)

sizeof( "abc"                );


3

Example: Scalar (ref): (matches)

sizeof( \"abc"               );


3

Example: Nothing: (matches)

sizeof( undef                );


0

Example: Multiple values: (matches)

sizeof( "a", "b", "c"        );


3

check

True if all items in list pass the test.
Usage: check [OPTIONS], [TEST], LIST

OPTIONS:

-opr    (or|and|xor)                            Operator  (default: 'and')

TEST:

-test   (def|num|str|match|blessed|eval)        Test type (default: 'def')
-isa    EXPR
-ref    EXPR

OPERATORS:

and             True when all items pass the test.

or              True when any single item passes the test.

xor             Alternation pattern. True unless two consecutive values
                both pass or fail the test.

BASIC TEST:

def             Items are defined
num             Items are numeric
str             Items are *not* numeric

OTHER TESTS:

match=EXPR      Items match EXPR
eval            Items are eval'd and truth is based on $@.  Note that the
                eval *actually* happens, so don't do anything that will
                break your code.  The intention of this check is for:

Example returns: abort:

my $compression = check( '-test=eval', 'use IO::Zlib' ) ? 1 : 0;

STRUCTURE TESTS:

blessed         Items are blessed
ref=EXPR        Item's ref matches EXPR (does *not* include @ISA)
isa=EXPR        Item's ref or @ISA match EXPR.  Much like UNIVERSAL::isa
                except allows regular expressions.

Example: none are defined returns: false:

check( undef, undef, undef );

Example: only one is defined returns: false:

check( 1, undef );

Example: both are defined returns: true:

check( 1, 1 );

Example: one is defined returns: true:

check( 1, undef, -opr => 'or' );

Example returns: false:

check( -opr => 'xor', 1, 1 );

Example returns: false:

check( -opr => 'xor', undef, undef );

Example returns: true:

check( -opr => 'xor', undef, 1 );

Example returns: true:

check( -opr => 'xor', 1, undef );

Example returns: true:

check( -opr => 'xor', 1, undef, 1, undef );

Example returns: false:

check( -opr => 'xor', 1, undef, 1, 1, undef );

Example returns: true:

check( -opr => 'xor', undef, 1, undef, 1 );

opts

  • Usage: opts [OPTIONS], \ARRAY, [\HASH]

    Split parameter arrays into options and arguments.

    OPTIONS:

    -prefix=EXPR            # specify option prefix, default is single dash (-).
    
    
    
    -assign=EXPR            # specify assignment character, default is the
                              equal sign (=).
    
    
    -append=EXPR            # specify append character, default is the
                              plus sign (+).

    In array context, we return two references. Which may cause confusion:

    my %opts = Hub::opts( \@_ );                # Wrong!
    my $opts = Hub::opts( \@_ );                # Correct!
    my ($opts,$args) = Hub::opts( \@_ );        # Correct!

    Options are extracted (via splice) from the referenced array. The advantage is both for performance (don't make a copy of the array), and so you may use @_ (or @ARGV, etc) normally, as data:

    Example: at-underscore contains everyting but the '-with' option: (matches)

    sub myjoin {
       my $opts = Hub::opts( @_ );
       return join( $$opts{'with'}, @_ );
    }
    
    myjoin( 'a', 'b', '-with=;', 'c', 'd' );
    
    
     a;b;c;d

    1. Arguments are elements which do *not* begin with a dash (-).

    2. Options are elements which begin with a single dash (-) and are not negative numbers.

    3. An option of '-opts' is reserved for passing in already parsed option hashes.

    4. Options will have their leading dash (-) removed.

    5. Options values are formed as:

    Given:                  opt1 will be:       because:
    
    
    -opt1=value             'value'             contains an equal sign
    -opt1 nextelem          'nextelem'          next element is *not* an option
    -opt1 -option2          1                   next element is also an option
    -opt1                   1                   it is the last element
    -opt1                   1                   it is the last element
    -opt1=a -opt1=b         b                   last one wins
    -opt1=a +opt1=b         [ 'a', 'b' ]        it was specified using '+'
    +opt1=a +opt1=b         [ 'a', 'b' ]        they can both be '+'

    For example:

    my($opts,$args) = Hub::opts( [ 'a', 'b', '-c' => 'c', '-x', '-o=out' ] );
    
    print "Opts:\n", Hub::hprint( $opts );
    print "Args:\n", Hub::hprint( $args );

    Will print:

    Opts:
    c => c
    o => out
    x => 1
    Args:
    a
    b

objopts

Split @_ into ($self,$opts), leaving @_ with remaining items.
Usage: objopts \@params, [\%defaults]

Convienence method for splitting instance method parameters.

Returns an array.

Example: Test return value: (matches)

my $obj = mkinst( 'Object' );
my @result = objopts( [ $obj ] );
join( ',', map { ref($_) } @result );



  Hub::Base::Object,

cmdopts

Extract short and long options from @ARGV
Usage: cmdopts \@arguments
Usage: cmdopts \@arguments, \%default_options

Single-dash paramaters are always boolean flags. Flags are broken apart such that:

-lal

becomes

-l -a -l

To create a list (ARRAY) of items, use '++' where you would normally use '--'.

Example: (matches)

my $opts = cmdopts(['--letters=a', '++letters=b', '++letters=c']);
join('-', @{$$opts{'letters'}});


  a-b-c

subst

  • Usage: subst

    Call to perl's substitution operator. Represented here as a function to facilitate transformation by reducing the need for temporaries. In essence, the goal is to reduce:

    my $bakname = getfilename();
    $bakname =~ s/\.db$/\.bak/;

    to:

    my $bakname = Hub::subst( getfilename(), '\.db$', '.bak' );

    without modifying the original string returned by getfilename().

getuid

Return the UID of the provided user
Usage: getuid $user_name
If perl has not been compiled with 'getpwnam', $user_name is returned.

-1 is returned when no user is found

getgid

Return the GID of the provided group
Usage: getgid - $group_name
If perl has not been compiled with 'getgrnam', $group_name is returned.

-1 is returned when no group is found

touch

  • Usage: touch LIST

    Changes the access and modification times on each file of a list of files.

expect

Croak if arguments do not match their expected type
Usage: expect [OPTIONS], [TEST], LIST

OPTIONS:

-back   \d      # Carp level (for reporting further up the callstack)
-not    0|1     # Invert the result

TESTS:

-blessed        # All LIST items are blessed
-match=EXPR     # All LIST items match /EXPR/
-ref=EXPR       # All LIST items' ref match /EXPR/

By default, LIST is made up of key/value pairs, where the key is the type (what ref() will return) and the value is what will be tested. LIST may contain one or more key/value pairs such as:

HASH            => arg
REF             => arg
My::Package     => arg

Example returns: true:

Hub::expect( -match => 'and|or|xor', 'and' );

Example returns: true:

Hub::expect( HASH => {}, HASH => {} );

Example returns: abort:

Hub::expect( -blessed => {} );

Example returns: true:

Hub::expect( -blessed => mkinst( 'Object' ) );

Example returns: abort:

Hub::expect( -match => 'and|or|xor', 'if', 'or', 'and' );

Example returns: abort:

Hub::expect( ARRAY => {} );

Example returns: abort:

Hub::expect( -blessed => 'abc' );

Example returns: true:

Hub::expect( -ref => 'HASH', {} );

Example returns: true:

Hub::expect( -ref => 'HASH', mkinst('Object') );

fear

  • Croak if arguments match their feared type.

    This is a shortcut to expect with a '-not=1' option.

    Example returns: abort:

    Hub::fear( HASH => {} );

    Example returns: true:

    Hub::fear( HASH => [] );

abort

Croak nicely.
Usage: abort -msg => 'Croak message'
Usage: abort -back => LEVEL

Example returns: abort:

abort( -msg => 'Goddamn hippies' );

bestof

  • Usage: bestof @list
    Usage: bestof @list, -by=max|min|def|len|gt|lt|true

    Best value by criteria (default 'def').

min

Minimum value
Usage: min @LIST

Returns the least element in a set.

Example: Two integers: (matches)

Hub::min(1,2);


1

Example: Three integers: (matches)

Hub::min(2,1,3);


1

Example: Three integers: (matches)

Hub::min(2,-1,3);


-1

Example: One integer: (matches)

Hub::min(1);


1

Example: Undefined value: (matches)

Hub::min(1,undef);


1

Example: Zero: (matches)

Hub::min(undef,1,0);


0

Example: Three decimal values: (matches)

Hub::min(.009,1.001);


0.009

max

Maximum value
Usage: max @LIST

Returns the greatest element in a set.

Example: Three decimal values: (matches)

Hub::max(.009,-1.01,2,undef,0);


2

intdiv

Integer division
Usage: intdiv $DIVIDEND, $DIVISOR

Returns an array with the number of times the divisor is contained in the dividend, and the remainder.

Example: 3 divided by 2 is 1R1: (matches)

join(',',Hub::intdiv(3,2));


1,1

flip

  • given a hash reference, swap keys with values and return a new hash reference.

rmval

Remove matching elements from a hash or an array.
Usage: rmval \@array, $value
Usage: rmval \%hash, $value

Example: (matches)

join('',@{rmval([1,2,3,4],3)});


124

cpref

Recursively clone the reference, returning a new reference.
Usage: cpref ?ref
Implemented because the Clone module found on CPAN crashes under my mod_perl
and FastCGI test servers...

checksum

Create a unique identifier for the provided data
Usage: checksum [params..]
Params can be scalars, hash references, array references and the like.

Example: (matches)

my $x = 'like catfood';
Hub::checksum( 'my', { cats => 'breath' }, ( 'smells', $x ) );



  2023611966

merge

Merge several hashes
Usage: merge \%target, \%source, [\%source..], [options]

Merges the provided hashes. The first argument (destination hash) has precedence (as in values are NOT overwritten) unless -overwrite is given.

OPTIONS:

-overwrite=1            Overwrite values as they are encounterred.



-prune=1                Gives the destination hash the same structure as
                        the source hash (or the composite of all which is
                        in common when multiple source hashes are provided).



                        If the destination is missing a value, it is
                        initialized from the source hash.



                        If the destination has a value which is not in all
                        of the source hashes, it is deleted.

flatten

Get a consistent unique-by-data string for some data structure.
Usage: flatten \%hash
Usage: flatten \%array

replace

  • Usage: replace MATCHING_REGEX, SUBSTITUTION_REGEX, TEXT

    Do a s/// operation on a given segment of the string.

    For example, say we want to remove the ': ;' pattern from the style portion, but not from the data portion:

    <div style="font-family: ;">keep this: ;stuff</div>

    Use this method as:

    $text = Hub::replace( "style=\".*?\"", "s/[\\w\\-]+\\s*:\\s*;//g", $text );

digout

  • Usage: digout REF, ID

    Return an array of all nested values in an order that can be processed.

    NOTE! Scalar values are returned as references.

    See how 'packdata' uses this method to dereference.

    Arrays are ignored unless their members are hashes with an _id member.

    Reverse the results of this array to process data in a way that the children are affected before their parents.

diff

Creates a nest of the differences between the provided structures.
Usage: diff \%hash1, \%hash2
Usage: diff \@array1, \@array2

If a conflict of types (with the same key) is encounterred, the right-hand sturcture is used.

NOTE: Although this routine compares contents, it returns references to the original hashes (use Hub::cpref on the result to detatch.)

dice

Break apart the string into the least number of segments
Usage: dice [options] $string
options:
 beg=$literal    Begin of balanced pair, Default is '{'
 end=$literal    End of balanced pair, Default is '}'

Example: (matches)

join( ';', dice( "a{b{c}}c{d}" ) );


a;{b{c}};c;{d}

indexmatch

Search for an expression within a string and return the offset
Usage: indexmatch [options] $string, $expression, $position
Usage: indexmatch [options] $string, $expression
Returns -1 if $expression is not found.

options: after 1|0 Return the position *after* the expression. Default is 0.

Example: (matches)

indexmatch("abracadabra", "[cd]")


4

Example: (matches)

indexmatch("abracadabra", "a", 3)


3

Example: (matches)

indexmatch("abracadabra", "d{2,2}")


-1

Example: (matches)

indexmatch("scant", "can", "-after=1")
            - indexmatch("scant", "can")


3

INTERNAL METHODS

_assignopt

  • Usage: _assignopt Assign an option value.
    
    Usage: _assignopt \%options, \%dest, $key, $val

_mergeHash

_mergeArray

_getId

_mergeElement

_diff_hashes

  • Usage: _diff_hashes &HASH, &HASH

    Difference between two hashes.

_diff_arrays

  • Usage: _diff_arrays &ARRAY, &ARRAY

    Difference between two arrays.

AUTHOR

Ryan Gies (ryangies@livesite.net)

COPYRIGHT

Copyright (C) 2006-2007 by Livesite Networks, LLC. All rights reserved.

Copyright (C) 2000-2005 by Ryan Gies. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.

* Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.

* The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

To the best of our knowledge, no patented algorithms have been used. However, we do not have the resources to carry out a patent search, and therefore cannot give any guarantee of the above statement.

UPDATED

06/09/2007