Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助理解Perl中使用File::stat的语句吗_Perl - Fatal编程技术网

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

需要帮助理解Perl中使用File::stat的语句吗,perl,Perl,在下面的代码中,语句“$retMode&0777”和“$retMode&006”是什么意思 在POSIX环境中,文件模式是一组位,用于描述文件所有者、文件组和其他所有人的读、写和执行权限 有关完整概述,请参阅或谷歌“linux文件权限” 在这种情况下 if(($retMode & 006)) { printf "$property|%03o|$fpath\n",$retMode; } 仅当您对文件具有写入或读取权限时,条件中的代码才会运行。$retMode&0777意味着您

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


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

有关完整概述,请参阅或谷歌“linux文件权限”

在这种情况下

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

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

$retMode&0777
意味着您获取返回模式(即文件权限+文件类型)的值,其八进制表示数为777(例如十进制511,例如二进制111111111)

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

为什么?因为(如图所示),
mode()
stat
返回:

包含文件类型及其权限,如果要查看真正的权限,应屏蔽文件类型部分并使用“%o”进行打印

换句话说,它确实包含第9位以上的数据,但只有最后9位表示权限数据,而这正是上面的代码所遵循的。更准确地说,最后12位表示权限(因此代码应该改为执行
&07777
),但位10-12表示与用户/组/其他读/写/执行PERM(例如setuid,is_目录)无关的特殊权限位


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

请注意,
&006
实际上是一种糟糕的编码风格,因为不清楚哪些位是哪个perm(正如我试图通过不解释上面段落中的位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; 
}
它们是位操作

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

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

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

$RetMode&0777:

$RetMode:   xxxxxxxxxxxxxxxxxx
0777        000000000111111111
Result:     000000000xxxxxxxxx
$RetMode&006:

$RetMode:   000000000xxxxxxxxx
0777        000000000000000110
Result:     000000000000000xx0

正如Gravion所说,您正在测试该文件的权限。

我想您的意思是,任意用户是否具有写入或读取权限。为什么代码会检查“其他”的读取或写入权限?您是否尝试查看
&
运算符的含义?@Ether-这是对我的评论或OP的响应?@DVK:OP;很抱歉给你带来了困惑。
$RetMode:   000000000xxxxxxxxx
0777        000000000000000110
Result:     000000000000000xx0