sub change_hash_values {
my $sub = shift;
my $h = shift;
my $match = shift;
return unless ref($h);
for ( ref($h) ) {
/HASH/ and do {
for ( keys %$h ){
change_hash_values ( $sub, $h->{$_}, $match );
$h->{$_} = $sub->( $h->{$_} ) if /$match/;
}
};
/ARRAY/ and do {
change_hash_values ( $sub, $_, $match ) for @$h;
};
}
}
my $z = {
foo => [qw(a b c)],
bar => [ 'a' , { changeme => 'oz' } ],
baz => 'z'
};
change_hash_values( sub { $_[0]=~s/z/x/g; return $_[0]; },$z, qr/change/);
# Turns oz into ox
Take a look at [cpan://Data::Rmap]. Something like this should do the trick.
use Data::Rmap qw[ rmap_hash ];
rmap_hash{
for my $key ( keys %{ $_ } ) {
next unless $key eq 'Target key value';
$_->{ $key } =~ $someRegex;
}
} $refToArbitraryStructure;
Whether that is an easier than what you have is your decision. More efficient? Benchmark it :)
perlmonks.org content © perlmonks.org and bduggan, BrowserUk
prlmnks.org © 2006 edmund von der burg (eccles & toad)
v 0.03