BATsh
view release on metacpan or search on metacpan
lib/BATsh/Env.pm view on Meta::CPAN
# relative Unix path: prepend cwd
my $cwd = BATsh::MB::enc(defined(&Cwd::cwd) ? Cwd::cwd() : '.');
$cwd =~ s{\\}{/}g;
$cwd =~ s{/+\z}{};
$path = "$cwd/$path";
}
# Ensure exactly one leading slash
$path = "/$path" unless $path =~ m{\A/};
# Collapse . and ..
my @segs;
for my $p (split m{/+}, $path) {
next if $p eq '' || $p eq '.';
if ($p eq '..') { pop @segs if @segs }
else { push @segs, $p }
}
$path = '/' . join('/', @segs);
$path = '/' if $path eq '/';
}
# --- split path into directory and filename ---
my ($dirs, $file) = ('', '');
lib/BATsh/SH.pm view on Meta::CPAN
my $v = _arr_get_element($1, _arr_expand_sub($class, $2));
defined $v ? length($v) : 0
}
/ge;
# ${!NAME[@]} / ${!NAME[*]} -- list of indices / keys
$str =~ s/\$\{!([A-Za-z_][A-Za-z0-9_]*)\[[\@*]\]\}/
_protect_lit(join(' ', _arr_ordered_keys($1)))
/ge;
# ${NAME[@]} / ${NAME[*]} -- all elements (space-joined word-split model)
$str =~ s/\$\{([A-Za-z_][A-Za-z0-9_]*)\[[\@*]\]\}/
_protect_lit(join(' ', _arr_values($1)))
/ge;
# ${NAME[SUB]} -- single element
$str =~ s/\$\{([A-Za-z_][A-Za-z0-9_]*)\[([^\]]*)\]\}/
do {
my $v = _arr_get_element($1, _arr_expand_sub($class, $2));
defined $v ? _protect_lit($v) : ''
}
( run in 0.805 second using v1.01-cache-2.11-cpan-af0e5977854 )