#!/usr/bin/env perl use strict; use warnings; use autodie ':all'; use constant { OLD => 0, NEW => 1, }; print "OS: $^O; Perl: $^V\n"; my @filenames = 'a' .. 'd'; my %perms = ( a => [0644, 0644], b => [0644, 0755], c => [0644, 0440], d => [0644, 07644], ); print "\n*** Initial permissions (visual check):\n"; list_perms(@filenames); print "\n*** Initial permissions (program check):\n"; check_perms(\@filenames, \%perms, OLD); change_perms(\@filenames, \%perms, NEW); print "\n*** Modified permissions (visual check):\n"; list_perms(@filenames); print "\n*** Modified permissions (program check):\n"; check_perms(\@filenames, \%perms, NEW); change_perms(\@filenames, \%perms, OLD); print "\n*** Restored permissions (visual check):\n"; list_perms(@filenames); print "\n*** Restored permissions (program check):\n"; check_perms(\@filenames, \%perms, OLD); sub list_perms { my (@files) = @_; my @cmd_list = (ls => '-l', @files); CORE::system {$cmd_list[0]} @cmd_list; return; } sub check_perms { my ($files, $perms, $oldnew) = @_; for my $file (@$files) { my $perm = (stat $file)[2] & 07777; my $expected = sprintf('%#5o', $perms->{$file}[$oldnew]); print "File: '$file'; Perm: ", sprintf('%#5o', $perm), '; Check: ', ( $perm == $perms->{$file}[$oldnew] ? 'OK' : "WRONG (expected: $expected)" ), "\n"; } return; } sub change_perms { my ($files, $perms, $oldnew) = @_; for my $file (@$files) { chmod $perms->{$file}[$oldnew], $file; } return; }