Data-Munge
view release on metacpan or search on metacpan
lib/Data/Munge.pm view on Meta::CPAN
submatches
trim
);
sub byval (&$) {
my ($f, $x) = @_;
local *_ = \$x;
$f->($_);
$x
}
sub elem {
my ($k, $xs) = @_;
if (ref $k) {
for my $x (@$xs) {
return 1 if ref $x && $k == $x;
}
} elsif (defined $k) {
for my $x (@$xs) {
return 1 if defined $x && !ref $x && $k eq $x;
}
} else {
for my $x (@$xs) {
return 1 if !defined $x;
}
}
!1
}
sub eval_string {
my ($code) = @_;
my ($package, $file, $line) = caller;
local $Data::Munge::_err = $@;
$code = qq{\$\@ = \$Data::Munge::_err; package $package; # eval_string()\n#line $line "$file"\n$code};
my @r = wantarray ? _eval $code : scalar _eval $code;
die $@ if $@;
$@ = $Data::Munge::_err;
wantarray ? @r : $r[0]
}
sub list2re {
@_ or return qr/(?!)/;
my $re = join '|', map quotemeta, sort {length $b <=> length $a || $a cmp $b } @_;
$re eq '' and $re = '(?#)';
qr/$re/
}
sub mapval (&@) {
my $f = shift;
my @xs = @_;
map { $f->($_); $_ } @xs
}
if ($^V ge v5.16.0) {
eval_string <<'EOT';
sub rec (&) {
my ($f) = @_;
sub { $f->(CORE::__SUB__, @_) }
}
EOT
} elsif (eval { require Scalar::Util } && defined &Scalar::Util::weaken) {
*rec = sub (&) {
my ($f) = @_;
my $w;
my $r = $w = sub { $f->($w, @_) };
Scalar::Util::weaken($w);
$r
};
} else {
# slow but always works
*rec = sub (&) {
my ($f) = @_;
sub { $f->(&rec($f), @_) }
};
}
sub replace {
my ($str, $re, $x, $g) = @_;
my $f = ref $x ? $x : sub {
my $r = $x;
$r =~ s{\$([\$&`'0-9]|\{([0-9]+)\})}{
$+ eq '$' ? '$' :
$+ eq '&' ? $_[0] :
$+ eq '`' ? substr($_[-1], 0, $_[-2]) :
$+ eq "'" ? substr($_[-1], $_[-2] + length $_[0]) :
$_[$+]
}eg;
$r
};
if ($g) {
$str =~ s{$re}{ $f->(substr($str, $-[0], $+[0] - $-[0]), submatches(), $-[0], $str) }eg;
} else {
$str =~ s{$re}{ $f->(substr($str, $-[0], $+[0] - $-[0]), submatches(), $-[0], $str) }e;
}
$str
}
sub slurp {
local $/;
scalar readline $_[0]
}
sub submatches {
no strict 'refs';
map $$_, 1 .. $#+
}
sub trim {
my ($s) = @_;
return undef if !defined $s;
$s =~ s/^\s+//;
$s =~ s/\s+\z//;
$s
}
sub is_callable {
my ($f) = @_;
require Scalar::Util;
my $t = Scalar::Util::reftype($f);
defined $t && ($t eq 'CODE' || (require overload, overload::Method($f, '&{}')))
}
'ok'
__END__
( run in 1.647 second using v1.01-cache-2.11-cpan-0d23b851a93 )