需要帮助理解Perl中使用File :: stat的语句

Hoz*_*ozy 3 perl

在下面的代码中,语句" $retMode & 0777"和" $retMode & 006"是什么意思?

 use File::stat;  

 my $fpath = "/home/xyz/abc.sh" ;  
 my $info ;  
 my $retMode ;  
 my $property = "File_Permission";  

 $info=stat($fpath) ;  
 if($info){  
     $retMode = $info->mode; # This field contain file mode info  
     $retMode = $retMode & 0777;  
     if(($retMode & 006)) {  
        printf "$property|%03o|$fpath\n",$retMode;  
     }  
 }
Run Code Online (Sandbox Code Playgroud)

DVK*_*DVK 5

$retMode & 0777表示您获取返回模式的值(文件权限+文件类型)和按位 - 并且它的八进制表示编号为777(例如十进制511,例如二进制111111111).

这在技术上是从第9位以上的整数中删除任何位,因此如果模式二进制表示大于9位,则在此操作之后,它将仅留下最后9位,表示主要权限(读/写/执行其他/组/用户).

为什么?因为(如perldoc stat显示),mode()返回自stat:

" 包含文件类型及其权限,如果要查看真实权限,则应使用"%o"屏蔽文件类型部分和(s)printf".

换句话说,它包含高于第9位的数据,但只有最后9位表示权限数据,这是上述代码之后的数据.更确切地说,最后12位数表示权限(因此代码应该这样做& 07777),但位10-12表示与用户/组/其他读/写/执行权限无关的特殊权限位(例如setuid,is_directory).


$retMode & 006有类似的机制,但目的不同.006八进制是二进制110,因此它基本上取模式位向量,只留下2/3位的位.由于结果在布尔上下文中使用,因此它仅检查结果#是否为非零,这意味着如果将这2位中的一个设置为1.

请注意,这& 006实际上是BAD编码风格,因为不明显哪些位是哪个perms(因为我试图通过不解释上面段落中2/3位的含义来巧妙地暗示).相反,您应该从Fcntl模块导入符号模式常量(S_IF*)和函数(S_IS*):

use Fcntl ':mode';
$retMode = $retMode & 0777; # Ignoring setuid and directory bits
$other_read_or_write = $retMode & (S_IWOTH || S_IROTH); 
                                  # Bits 2/3 - Other read/write
if ($other_read_or_write) {
    printf "$property|%03o|$fpath\n",$retMode; 
}
Run Code Online (Sandbox Code Playgroud)