chmod chmod LIST
这个函数改变一列文件的权限。列表的第一个元素必须是一个数字模式,就象在 chmod(2) 系统调用里的一样。该函数返回成功改变了的文件的数目。比如:
$cnt = chmod 0755, 'file1', 'file2';
会把 $cnt 设置为 0,1,或 2,具体是多少取决于改变的文件的数目。成功是通过没有错误来表示的,而不是通过实际的修改的数目,因为一个文件可能会拥有和操作之前相同的模式。一个错误可能意味着你缺乏修改文件模式的足够的权限,你可能既不是文件的所有者也不是超级用户。检查 $! 看看失败的实际原因是什么。
下面是更多的一些典型用法:
chmod(0755, @executables) == @executables or die "couldn't chmod some of @executables: $!";
如果你想知道是哪个文件不允许这样的修改,使用象下面这样的代码:
@cannot = grep {not chmod 0755, $_} 'file1', 'file2', 'file3'; die "$0: could no chmod @cannot\n" if @cannot;
这个惯用法使用 grep 函数选择列表里那些 chmod 函数对之操作失败的元素。
如果使用非文本模式数据,那么你可能需要用 oct 函数把一个八进制字串转换成一个数字。这就是为什么 Perl 不会因为一个字串有一个前导 "0" 而就假定它包含一个八进制数字。
$DEF_MODE = 0644; # 这里不能用引号! PROMPT: { print "New mode? "; $strmode = ; exit unless defined $strmode; # 测试 eof if ($strmode =~ /^\s*$/) { # 测试空白行 $mode = $DEF_MODE; } elsif ($strmode !~ /^\d+$/) { print "Want numeric mode, no $strmode\n"; redo PROMPT; } else { $mode = oct($strmode); # 把 "755" 转换成 0755 } chmod $mode, @files; }
这个函数与数字模式一起使用的时候很象 Unix chmod(2) 系统调用。如果你需要象 chmod(1) 命令提供的那样的符号接口,你可以看看 CPAN 上的 File::chmod 模块。
你还可以从 Fcntl 模块里输入 S_I* 符号常量:
use Fcntl ':mode'; chmod S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH , @executalbes;
有些人认为上面这个比 0755 的可读性更好。你可以自己试试。