The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use vars qw(
    %UIDsByUsername %UsernamesByUID %GIDsByGroupname
    %GroupnamesByGID %UIDinGID
);

package # split to avoid confusing stupid software
    File::Find::Rule::Permissions;

no warnings qw(redefine);
sub stat {
    my $filename = shift;
    my @stat = CORE::stat($filename);
    my $mode = oct($filename);
    # print "$filename: mode=$mode, user=$File::Find::Rule::Permissions::Tests::userid, group=$File::Find::Rule::Permissions::Tests::groupid\n";
    return (
        @stat[0, 1], $mode, $stat[3],
        $File::Find::Rule::Permissions::Tests::userid,
        $File::Find::Rule::Permissions::Tests::groupid,
        @stat[6..12]
    );
}

sub getusergroupdetails {
    my %params = @_;
    my $users = $params{users};         # { user1 => 1, user2 => 2 }
    my $groups = $params{groups};       # { group1 => 1, group2 => 2 }
    my $UIDinGID = $params{UIDinGID};   # { $gid1 => [$uid1, $uid2] }

    %UIDsByUsername = %{$users};
    %UsernamesByUID = reverse(%UIDsByUsername);
    %GIDsByGroupname = %{$groups};
    %GroupnamesByGID = reverse(%GIDsByGroupname);
    %UIDinGID = ();

    foreach my $gid (keys %{$UIDinGID}) {
        $UIDinGID{$gid}{$_} = 1 foreach(@{$UIDinGID->{$gid}});
    }
}