The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Switch::Reftype - Execute code based on which type of reference is given.

VERSION

version 0.001

SYNOPSIS

  # switch-like statement on the reftype of a given variable:
  use Switch::Reftype;              # switch_reftype is imported by default.
  $result = switch_reftype $foo,
    SCALAR      => sub {...},       # Run when $foo is a SCALAR reference
    ARRAY       => sub {...},       # Run when $foo is an ARRAY reference
    HASH        => sub {...},       # Run when $foo is a HASH reference
    CODE        => sub {...},       # Run when $foo is a CODE reference
    REF         => sub {...},       # Run when $foo is a REF reference
    GLOB        => sub {...},       # Run when $foo is a GLOB reference
    LVALUE      => sub {...},       # Run when $foo is an LVALUE reference
    FORMAT      => sub {...},       # Run when $foo is a FORMAT reference
    IO          => sub {...},       # Run when $foo is an IO reference
    VSTRING     => sub {...},       # Run when $foo is a VSTRING reference
    REGEXP      => sub {...},       # Run when $foo is a Regexp reference
    scalar      => sub {...},       # Run when $foo isn't a reference
    undef       => sub {...},       # Run when not defined $foo
    default     => sub {...},       # Run when the reftype of $foo isn't given
  ;
  
  # map-like functions. $foo is aliassed to $_ inside the BLOCK:
  use Switch::Reftype ':all';       # Import all functions.
  $result = if_SCALAR {...} $foo;
  $result = if_ARRAY {...} $foo;
  $result = if_HASH {...} $foo;
  $result = if_CODE {...} $foo;
  $result = if_REF {...} $foo;
  $result = if_GLOB {...} $foo;
  $result = if_LVALUE {...} $foo;
  $result = if_FORMAT {...} $foo;
  $result = if_IO {...} $foo;
  $result = if_VSTRING {...} $foo;
  $result = if_REGEXP {...} $foo;

DESCRIPTION

Sometimes, you want your subroutine or method to perform a specific action based on the type of argument given. For example, your subroutine might accept either a simple scalar, an array reference, or a hash reference. Depending on which type of argument your subroutine got, it has to act slightly differently. The Switch::Reftype family of functions help you to easily codify these differences.

Switch::Reftype relies heavily on "reftype" in Scalar::Util from Scalar::Util module.

FUNCTIONS

switch_reftype

  switch_reftype $reference, %reftypes

The keys of %reftypes should correspond with the possible return values of "reftype" in Scalar::Util (for a complete list, see the "SYNOPSIS").

If $reference isn't a reference but just another scalar, switch_reftype will look for the element with key 'scalar'. Likewise, if $reference isn't defined, it will look for key 'undef'. If $referencer is both defined and a reference, switch_reftype will use Scalar::Util's reftype $reference to determine which key to look for.

If no suitable key/value pair was given (e.g. $reference is an ARRAY reference but no ARRAY => sub {...} pair exists), switch_reftype will look for the key 'default'.

If, at this point, still absolutely no appropriate key/value pair was found, switch_reftype gives up and returns undef (in scalar context) or the empty list (in list context).

Otherwise, it calls the found subref and returns whatever that returns. Inside the subref, $reference is aliassed to $_.

if_SCALAR

  if_SCALAR {...} $reference;

Syntactic sugar for

  switch_ref $reference
    SCALAR => sub {...},
    default => sub { $reference }
  ;

In other words, it calls the subroutine and returns whatever that returns if $reference is a reference to a scalar, or else it just returns $reference.

if_ARRAY

  if_ARRAY {...} $reference

Like "if_SCALAR", but for ARRAY references.

if_HASH

  if_HASH {...} $reference

Like "if_SCALAR", but for HASH references.

if_CODE

  if_CODE {...} $reference

Like "if_SCALAR", but for CODE references.

if_REF

  if_REF {...} $reference

Like "if_SCALAR", but for REF references.

That is, references to references, as in:

  $ref = \"foo";    # Normal SCALAR reference
  $refref = \\$ref; # REF reference

if_GLOB

  if_GLOB {...} $reference

Like "if_SCALAR", but for GLOB references (i.e. \*foo)

if_LVALUE

  if_LVALUE {...} $reference

Like "if_SCALAR", but for LVALUE references.

LVALUE references really get into the guts of what you can do with references. It's beyond the scope of this document to explain them, but see ref. Mostly included for completeness' sake.

if_FORMAT

  if_FORMAT {...} $reference

Like "if_SCALAR", but for FORMAT references (see format). Mostly included for completeness' sake.

if_IO {...}

  if_IO {...} $reference

Like "if_SCALAR", but for IO references (i.e. *STDIN{IO}). Mostly included for completeness' sake.

if_VSTRING

  if_VSTRING {...} $reference

Like "if_SCALAR", but for VSTRING references (i.e. \v127.0.0.1).

if_REGEXP

  if_REGEXP {...} $reference

Like "if_SCALAR", but for Regexp references (i.e. qr/.../).

AUTHOR

P. Ramakers <pramakers@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by P. Ramakers.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.