#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub change_all_elements { my ( $data, $subref ) = @_; if ( ref($data) eq 'HASH' ) { for my $k ( keys %$data ) { change_all_elements( $data->{$k}, $subref ); } } elsif ( ref($data) eq 'ARRAY' ) { for my $line (@$data) { change_all_elements( $line, $subref ); } } elsif ( ref($data) eq '' ) { $subref->($data); } else { die "I dont know " . ref($data) . "\n"; } } my $deep = { a => 12, b => 13, c => { d => 14, e => 15, }, f => [ 16, 17, ] }; # I want to have all scalar elements to be 100x my $changed = change_all_elements( $deep, sub { 100 * $_[0]; } ); print "All changed:\n"; print Dumper($deep);