需要帮助理解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