my %filetypes = ( 'dir' => sub { -d _ }, 'link' => sub { -l _ }, 'file' => sub { -f _ }, ); my %updatetypes = ( 'mode' => \&change_mode, 'owner' => \&change_owner, 'group' => \&change_group, ); sub wanted_c { stat($_); for my $filetype (keys %wanted) { next unless &{ $filetypes{$filetype} }; my $wanted = $wanted{$filetype}; for my $update (keys %$wanted) { &{ $updatetypes{$update} }($_, $wanted->{$update}); } } }