在perl中使用stat时$ mode会保存什么

rug*_*ted 2 perl

伙计们试图使用stat查看perl中某个文件的权限.

所以当我这样做的时候

foreach (@original_files) {
    my($dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
      $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat ($_);

    print "$mode \n";
}
Run Code Online (Sandbox Code Playgroud)

这个输出:

33204 which corresponds to the permission -rw-rw-r--
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它是33204. < - 这是我的第一个问题

接下来我尝试将$ mode转换为octal,我知道这是umask的数字系统.

这是我的代码:

printf ("%0\n",$mode);
Run Code Online (Sandbox Code Playgroud)

现在这输出100664,我完全低于最后3位数(rw-rw-r--)但我不明白前三位数来自哪里(100664中的100) 这是我的第二个问题

最后是我再次尝试此代码:

printf ("%o\n", $mode & 775); #im not sure about the 775, or is it 577
Run Code Online (Sandbox Code Playgroud)

最后一个代码是我想要的.它输出664.我的问题是为什么当我和$模式忘记了价值(775或其他)时,它会输出正确的权限.

而OT问题:$ _和@_的区别是什么

ike*_*ami 6

从我的网站主机man 2 stat关于模式:

S_IFMT     0170000   bit mask for the file type bit fields
S_IFSOCK   0140000   socket
S_IFLNK    0120000   symbolic link
S_IFREG    0100000   regular file
S_IFBLK    0060000   block device
S_IFDIR    0040000   directory
S_IFCHR    0020000   character device
S_IFIFO    0010000   FIFO
S_ISUID    0004000   set UID bit
S_ISGID    0002000   set-group-ID bit (see below)
S_ISVTX    0001000   sticky bit (see below)
S_IRWXU    00700     mask for file owner permissions
S_IRUSR    00400     owner has read permission
S_IWUSR    00200     owner has write permission
S_IXUSR    00100     owner has execute permission
S_IRWXG    00070     mask for group permissions
S_IRGRP    00040     group has read permission
S_IWGRP    00020     group has write permission
S_IXGRP    00010     group has execute permission
S_IRWXO    00007     mask for permissions for others (not in group)
S_IROTH    00004     others have read permission
S_IWOTH    00002     others have write permission
S_IXOTH    00001     others have execute permission
Run Code Online (Sandbox Code Playgroud)

(注意,前导0意味着这些数字是八进制数.)

你可以在mode单词中看到七个字段.

S_IFMT   file type
S_ISUID  set UID bit
S_ISGID  set-group-ID bit
S_ISVTX  sticky bit
S_IRWXU  owner permissions
S_IRWXG  group permissions
S_IRWXO  other permissions
Run Code Online (Sandbox Code Playgroud)

如果您将模式视为其字段而不是数字(0x81B4 = 33204 = 0100664 = 0b1000000110110100),您会得到:

S_IFMT:  S_IFREG (regular file)
S_ISUID: 0 (no set UID bit)
S_ISGID: 0 (no set-group-ID bit)
S_ISVTX: 0 (no sticky bit)
S_IRWXU: S_IRUSR | S_IWUSR (user has rw)
S_IRWXG: S_IRGRP | S_IWGRP (group has rw)
S_IRWXO: S_IROTH (other has r)
Run Code Online (Sandbox Code Playgroud)

执行& 0777& (S_IRWXU | S_IRWXG | S_IRWXO)提取包含各种权限的字段相同.


$_是一个引用的变量$main::_.它是由一些结构设置(foreach循环map,grep),并作为许多运营商(如默认的say;意思say $_;).

将元素@_别名化为传递给正在执行的子的参数.例如$_[0]并因此$x包含4sub f { my ($x) = @_; ... } f(4);

  • @ruggedbuteducated是的,他做到了.decimal 33204 = octal 100664 = S_IFREG | 0 | 0 | 0 | (S_IRUSR | S_IWUSR)| (S_IRGRP | S_IWGRP)| S_IROTH. (2认同)