NAME
    String::Bash - Parameter expansion in strings

VERSION
    version 1.110960

SYNOPSIS
        use String::Bash qw( bash );

        # pass hashref
        print bash "Hello %{name:-Guest}!", { name => 'Alex' };

        # or key/value pairs
        print bash "Hello %{name:-Guest}!", name => 'Alex';

        # or object which can('name');
        my $user = My::Users->new( name => 'Alex' );
        print bash "Hello %{name:-Guest}!", $user;

        # or use lexical vars
        my $name = 'Alex';
        print bash "Hello %{name:-Guest}!";

    all will print

        Hello Alex

    or if *name* is undefined or empty

        Hello Guest

DESCRIPTION
    String::Bash is based on shell parameter expansion from Bash
    <http://www.gnu.org/software/bash/>, thus it allows to provide default
    values, substrings and in-place substitutions, changing case of
    characters and nesting.

    The String::Bash provides "bash" exported with Sub::Exporter.

REPLACEMENT VALUES
    Replacements can be provided in four different ways:

  Hash reference
        my $hashref = { param1 => 'value1', ... };
        print bash $format, $hashref;

  Key/value pairs
        print bash $format, param1 => 'value1', ...;

  Object
        print bash $format, $object;

    Please note that $object needs to implement *read/write* accessors (if
    "%{param:=word}" is used, otherwise *read-only* are sufficient) for all
    parameters used in $format.

  Lexical variables
        my $param1 = ...;
        our $param2 = ...;
        print bash $format;

    Lexical ("my") and package ("our") scalar variables visible at the scope
    of "bash" caller are available as replacement.

FORMAT SYNTAX
    Please assume that following variables are visible in below examples:

        my $param = 'hello';
        my $not_set;
        my $param2 = 'WELCOME';

  %{param}
        print bash "%{param}"; # hello

    Value of $param is substituted.

  %{param:-word}
        print bash "%{param:-word}";    # hello
        print bash "%{not_set:-word}";  # word

    If $param is unset or null, the expansion of *word* is substituted.
    Otherwise, the value of $param is substituted.

    The *word* can be another parameter so nesting is possible:

        print bash "%{not_set:-%{param2}}"; # WELCOME

  %{param:=word}
        print bash "%{not_set:=word}"; # word

    If $param is unset or null, the expansion of *word* is assigned to
    $param. The value of $param is then substituted.

    Notes on replacement syntax:

    *   If "Object" is passed as replacement than assignment will execute
        following code:

            $obj->$param( 'word' );

    *   If "Key/value pairs" are passed as replacement then the assignment
        will be applied to occurrences of *param* after the assignment has
        been done, and will be disregarded after parsing is done.

    *   If "Lexical variables" are used, then their value will be set to
        *word*.

  %{param:+word}
        print bash "%{param:+word}";   # word
        print bash "%{not_set:+word}"; #

    If $param is null or unset, nothing is substituted, otherwise the
    expansion of *word* is substituted.

  %{param:offset}
  %{param:offset:length}
        print bash "%{param:2}";     # llo
        print bash "%{param:2:2}";   # ll

    Expands to up to *length* characters of $param starting at the character
    specified by *offset*. If *length* is omitted, expands to the substring
    of $param starting at the character specified by *offset*.

  %{#param}
        print bash "%{#param}";   # 5

    The length in characters of the value of $param is substituted.

  %{param#word}
  %{param##word}
        print bash "%{param#he*l}";   # lo
        print bash "%{param##he*l}";  # o

    The *word* is expanded to produce a pattern (see "Pattern expansion").
    If the pattern matches the beginning of the value of $param, then the
    result of the expansion is the expanded value of $param with the
    shortest matching pattern (the *'#'* case) or the longest matching
    pattern (the *'##'* case) deleted.

  %{param%word}
  %{param%%word}
        print bash "%{param%l*o}";   # hel
        print bash "%{param%%l*o}";  # he

    The *word* is expanded to produce a pattern (see "Pattern expansion").
    If the *pattern* matches a trailing portion of the value of $param, then
    the result of the expansion is the value of $param with the shortest
    matching pattern (the *'%'* case) or the longest matching pattern (the
    *'%%'* case) deleted.

  %{param/pattern/string}
        print bash "%{param/l/t}";   # hetlo
        print bash "%{param//l/t}";  # hetto
        print bash "%{param/#h/t}";  # tello
        print bash "%{param/%o/t}";  # hellt

    The *pattern* is expanded to produce a pattern (see "Pattern
    expansion"). The longest match of *pattern* against $param value is
    replaced with *string*. If *pattern* begins with *'/'*, all matches of
    *pattern* are replaced with *string*. Normally only the first match is
    replaced. If *pattern* begins with *'#'*, it must match at the beginning
    of the value of $param. If *pattern* begins with *'%'*, it must match at
    the end of the $param. If *string* is null, matches of *pattern* are
    deleted and the */* following *pattern* may be omitted.

  %{param^pattern}
  %{param^^pattern}
  %{param,pattern}
  %{param,,pattern}
        print bash "%{param^}";     # Hello
        print bash "%{param^^}";    # HELLO
        print bash "%{param2,}";    # wELCOME
        print bash "%{param2,,}";   # welcome

        print bash "%{param^[hl]}";     # Hello
        print bash "%{param^^[hl]}";    # HeLLo
        print bash "%{param2,[WE]}";    # wELCOME
        print bash "%{param2,,[WE]}";   # weLCOMe

    This expansion modifies the case of alphabetic characters in $param. The
    *pattern* is expanded to produce a pattern (see "Pattern expansion").
    The *'^'* operator converts lowercase letters matching pattern to
    uppercase; the *','* operator converts matching uppercase letters to
    lowercase. The *'^^'* and *',,'* expansions convert each matched
    character in $param; the *'^'* and *','* expansions match and convert
    only the first character in the value of $param. If *pattern* is
    omitted, it is treated like a *'?'*, which matches every character.

NOTES
  Pattern expansion
    Pattern expansion is performed using following rules (based on filename
    expansion):

        # Character       # Replacement (perl syntax)
        *                 .*
        ?                 .
        [a-z]             [a-z]

    Please do not use perl regular expression syntax in pattern
    substitutions, or you may get unexpected results.

COMPATIBILITY WITH BASH
    String::Bash provides only syntax described above and some of Bash
    features (like expansions of arrays) are not available - but please let
    me know if you need them.

SEE ALSO
    *   Shell Parameter Expansion in Bash
        <http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-E
        xpansion.html#Shell-Parameter-Expansion>

AUTHOR
    Alex J. G. Burzyński <ajgb@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2011 by Alex J. G. Burzyński
    <ajgb@cpan.org>.

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

