Data-SmartMunge

 view release on metacpan or  search on metacpan

lib/Data/SmartMunge.pm  view on Meta::CPAN

use 5.008;
use strict;
use warnings;

package Data::SmartMunge;
BEGIN {
  $Data::SmartMunge::VERSION = '1.101612';
}

# ABSTRACT: Munge scalars, hashes and arrays in flexible ways
use Exporter qw(import);
our %EXPORT_TAGS = (util => [qw(smart_munge delete_matching)],);
our @EXPORT_OK = @{ $EXPORT_TAGS{all} = [ map { @$_ } values %EXPORT_TAGS ] };
my %munger_dispatch = (
    STRING_CODE => sub { $_[1]->($_[0]) },
    ARRAY_CODE  => sub { $_[1]->($_[0]) },
    HASH_CODE   => sub { $_[1]->($_[0]) },
    HASH_HASH   => sub { +{ %{ $_[0] }, %{ $_[1] } } },  # overlay
);

sub smart_munge {
    my ($data, $munger) = @_;

    unless (defined $munger) {
        return $data unless wantarray;
        return @$data if ref $data eq 'ARRAY';
        return %$data if ref $data eq 'HASH';
    }

    my $data_ref   = ref $data   || 'STRING';
    my $munger_ref = ref $munger || 'STRING';
    if (my $handler = $munger_dispatch{ $data_ref . '_' . $munger_ref }) {
        my $result = $handler->($data, $munger);
        return $result unless wantarray;
        return @$result if ref $result eq 'ARRAY';
        return %$result if ref $result eq 'HASH';
    } else {
        die "can't munge $data_ref with $munger_ref";
    }
}

sub delete_matching {
    my ($re, $flags) = @_;
    $flags = '' unless defined $flags;
    return $flags =~ s/g//
        ?  sub { $_[0] =~ s/$re//g; $_[0] }
        :  sub { $_[0] =~ s/$re//; $_[0] };
}


__END__
=pod

=head1 NAME

Data::SmartMunge - Munge scalars, hashes and arrays in flexible ways

=head1 VERSION

version 1.101612

=head1 SYNOPSIS

    use Data::SmartMunge qw(:all);

    my $s  = smart_munge('foo bar baz', sub { uc $_[0] });
    my $s2 = smart_munge('foo bar baz bar baz', delete_matching(qr/bar\s*/, 'g'));

    my $a_ref = smart_munge([ 1 .. 4 ], sub { [ reverse @{ $_[0] } ] });
    my @a = smart_munge([ 1 .. 4 ], sub { [ reverse @{ $_[0] } ] });

    my %h = smart_munge(
        { a => 'foo', b => 'bar' },
        sub {
            +{ map { $_ => uc $_[0]->{$_} } keys %{ $_[0] } };
        },
    );



( run in 0.991 second using v1.01-cache-2.11-cpan-d7f47b0818f )