my %vars = ( 'dir-mode' => \$d_mode, 'file-mode' => \$f_mode, 'link-mode' => \$l_mode, 'dir-owner' => \$d_own, 'file-owner' => \$f_own, 'link-owner' => \$l_own, 'dir-group' => \$d_grp, 'file-group' => \$f_grp, 'link-group' => \$l_grp, ); for my $testy (keys %{ $config{$test}{$tester} }) { unless ($vars{$testy}) { warn "Unexpected test key '$testy'"; next; } ${ $vars{$testy} } = $config{$test}{$tester}{$testy}; } #### my $wanted_this_time = { mode => $wanted_mode, owner => $wanted_owner, group => $wanted_group, }; #### my $wanted = { if_directory => { mode => $dir_mode, owner => $dir_owner, group => $dir_group, }, if_link => { ... } if_file => { ... } }; #### my %wanted; my %validfile = map +($_ => 1), qw/ dir file link /; my %validupdate = map +($_ => 1), qw/ mode owner group /; for (keys %{ $config{$test}{$tester} }) { my($filetype, $updatetype} = split /-/, $_, 2; unless ($validfile{$filetype} && $validupdate($updatetype}) { warn "Unexpected directive '$_'"; next; } $wanted{$filetype}{$updatetype} = $config{$test}{$tester}{$_}; } [...] sub wanted_c { stat($_); my $wanted = (-d _ ? $wanted{'dir'}) : (-l _ ? $wanted{'link'}) : (-f _ ? $wanted{'file'}) : return; # ?? warn unexpected type? return unless $wanted; # nothing to change if (defined $wanted->{'mode'}) { change_mode($_, $wanted->{'mode'}); } if (defined $wanted->{'owner'}) { change_owner($_, $wanted->{'owner'}); } if (defined $wanted->{'group'}) { change_group($_, $wanted->{'group'}); } } #### 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}); } } }