我一直试图了解下面提到的代码究竟发生了什么。但我无法理解它。
$mode = (stat($filename))[2];
printf "Permissions are %04o\n", $mode & 07777;
假设我的$ mode值为33188
$ mode& 07777产生值= 420
是$模式值的十进制数?
为什么我们选择07777以及我们为什么要进行按位和操作。我无法理解这里的逻辑。
答案 0 :(得分:7)
在perldoc -f stat中对此进行了解释,我假设您在此处找到了这个示例:
Because the mode contains both the file type and its
permissions, you should mask off the file type portion and
(s)printf using a "%o" if you want to see the real permissions.
printf "%04o", 420
的输出为0644
,这是您文件的权限。 420
只是八进制数0644
的十进制表示。
如果您尝试以二进制形式打印数字,则更容易看到:
perl -lwe 'printf "%016b\n", 33188'
1000000110100100
perl -lwe 'printf "%016b\n", 33188 & 07777'
0000000110100100
正如您将注意到的,按位and
删除上面数字中最左边的位,这可能代表文件类型,只留下文件权限。这个数字07777是二进制数:
perl -lwe 'printf "%016b\n", 07777'
0000111111111111
在按位and
中充当“掩码”。从1& 1 = 1,0& 1 = 0,表示07777中与1不匹配的任何位都设置为0。