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

时间:2011-01-13 20:28:03

标签: 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;  
     }  
 }

3 个答案:

答案 0 :(得分:5)

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

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

<强>为什么?因为(perldoc stat显示),mode()stat返回:

  

包含文件类型及其权限,如果要查看真实权限,则应使用”%o“屏蔽文件类型部分和(s)printf”。< / p>

换句话说,它包含高于第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; 
}

答案 1 :(得分:2)

在POSIX环境中,文件的模式是一组位,用于描述文件所有者,文件组以及其他所有人的读,写和执行权限。

有关完整概述,请参阅http://www.tuxfiles.org/linuxhelp/filepermissions.html或google“linux文件权限”。

在这种情况下

if(($retMode & 006)) {
      printf "$property|%03o|$fpath\n",$retMode;
}

条件中的代码只有在您对文件具有写入或读取权限时才会运行。

答案 2 :(得分:1)

它们是位操作Perl bitwise and

$ retMode&amp; 0777清除$ retMode底部9位以上的所有位。

$ retMode&amp; 006测试底部3位中的两位,如果这些位对应于数字2,3,4,5,6,7,则返回true(0以外的数字)

在图片中(其中x为1或0,从顶行到底行不变):

$ RetMode&amp; 0777:

$RetMode:   xxxxxxxxxxxxxxxxxx
0777        000000000111111111
Result:     000000000xxxxxxxxx

$ RetMode&amp; 006:

$RetMode:   000000000xxxxxxxxx
0777        000000000000000110
Result:     000000000000000xx0

正如引力图所示,您正在测试该文件的权限。