String-Bash

 view release on metacpan or  search on metacpan

lib/String/Bash.pm  view on Meta::CPAN

use strict;
use warnings;
package String::Bash;
BEGIN {
  $String::Bash::AUTHORITY = 'cpan:AJGB';
}
BEGIN {
  $String::Bash::VERSION = '1.110960';
}
#ABSTRACT: Parameter expansion in strings

use Sub::Exporter -setup => {
    exports => [qw( bash )],
};

use Regexp::Common qw( balanced );
use PadWalker qw( peek_my peek_our );
use Scalar::Util qw( blessed );



sub bash($@) {
    my $format = shift;

    my $lookup;
    my $setter;

    if ( defined $_[0] ) {
        if ( blessed $_[0] ) {
            my $obj = $_[0];
            $lookup = sub { my $var = shift; return $obj->$var; };
            $setter = sub { my $var = shift; $obj->$var(@_); };
        } else {
            if ( @_ == 1 && ref $_[0] eq 'HASH' ) {
                my $href = $_[0];
                $lookup = sub { return $href->{ $_[0] }; };
                $setter = sub { $href->{ $_[0] } = $_[1]; };
            } else {
                my %vars = @_;
                $lookup = sub { return $vars{ $_[0] }; };
                $setter = sub { $vars{ $_[0] } = $_[1]; };
            }
        }
    } else {

        my $allmyvars = peek_my(1);
        my $allourvars = peek_our(1);

        $lookup = sub {
            my $var = shift;
            $var = "\$$var";
            my $val = exists $allmyvars->{$var}
                ? $allmyvars->{$var} : $allourvars->{$var};

            return unless ref $val eq 'SCALAR';

            return ${ $val };
        };
        $setter = sub {
            my $var = shift;
            my $val = shift;
            $var = "\$$var";

            if ( exists $allmyvars->{$var} ) {
                ${ $allmyvars->{$var} } = $val;
            } elsif ( exists $allourvars->{$var} ) {
                ${ $allourvars->{$var} } = $val;
            }
        };
    };

    my $parser; $parser = sub {
        my $format = shift;

        return $format unless index($format, '%{') >= 0;

        my @ph = $format =~ /$RE{balanced}{-begin=>'%{'}{-end=>'}'}/gs;



( run in 3.111 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )