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 )