内容

名称

File::stat - Perl 内置 stat() 函数的按名称接口

概要

use File::stat;
my $st = stat($file) or die "No $file: $!";
if ( ($st->mode & 0111) && ($st->nlink > 1) ) {
    print "$file is executable with lotsa links\n";
} 

if ( -x $st ) {
    print "$file is executable\n";
}

use Fcntl "S_IRUSR";
if ( $st->cando(S_IRUSR, 1) ) {
    print "My effective uid can read $file\n";
}

use File::stat qw(:FIELDS);
stat($file) or die "No $file: $!";
if ( ($st_mode & 0111) && ($st_nlink > 1) ) {
    print "$file is executable with lotsa links\n";
} 

描述

此模块的默认导出覆盖了核心 stat() 和 lstat() 函数,用返回“File::stat”对象的版本替换它们。此对象具有返回 stat(2) 函数中类似命名的结构字段名称的方法;即,dev、ino、mode、nlink、uid、gid、rdev、size、atime、mtime、ctime、blksize 和 blocks。

从版本 1.02(随 perl 5.12 提供)开始,该对象提供了 "-X" 重载,因此您可以在其上调用文件测试运算符(-f-x 等)。它还提供了一个 ->cando 方法,调用方式如下

$st->cando( ACCESS, EFFECTIVE )

其中 ACCESS 是来自 Fcntl 模块的 S_IRUSRS_IWUSRS_IXUSR 之一,而 EFFECTIVE 指示是否使用有效(true)或真实(false) ID。该方法解释 modeuidgid 字段,并返回当前进程是否被允许指定访问权限。

如果您不想使用这些对象,可以将 ->cando 方法导入到您的命名空间中,作为名为 stat_cando 的常规函数。它以包含 statlstat 返回值的数组引用作为其第一个参数,并为您解释它。

您也可以使用 :FIELDS 导入标签将所有结构字段直接导入到您的命名空间中作为普通变量。(请注意,这仍然会覆盖您的 stat() 和 lstat() 函数。)访问这些字段作为变量,变量名称前面带有 st_,位于其方法名称之前。因此,如果您导入字段,$stat_obj->dev() 对应于 $st_dev。

要访问此功能而不进行核心覆盖,请将 use 传递给一个空的导入列表,然后使用其完全限定名称访问函数函数。另一方面,内置函数仍然可以通过 CORE:: 伪包访问。

错误

从 Perl 5.8.0 开始,在使用此模块后,您不能将隐式 $_ 或特殊文件句柄 _ 与 stat() 或 lstat() 一起使用,尝试这样做会导致奇怪的错误。解决方法是 $_ 明确

my $stat_obj = stat $_;

并且 _ 使用未导出且未记录的 populate() 函数和 CORE::stat() 显式填充对象

my $stat_obj = File::stat::populate(CORE::stat(_));

错误

-%s 在 File::stat 对象上未实现

文件测试运算符 -t-T-B 未实现,因为它们需要比 stat 缓冲区更多的信息。

警告

所有这些都可以通过以下方式禁用

no warnings "File::stat";
File::stat 忽略 use filetest 'access'

您尝试在 use filetest 'access' 生效的情况下使用 -rwxRWX 文件测试之一。File::stat 将忽略此 pragma,并像往常一样仅使用 mode 成员中的信息。

File::stat 忽略 VMS ACL

VMS 系统具有无法在 stat 缓冲区中完全表示的权限结构,并且与其他系统不同,内置文件测试运算符会尊重这一点。但是,File::stat 重载不会,因为所需的信息不可用。

注意

虽然此类目前使用 Class::Struct 模块来构建类似结构的类,但您不应该依赖于此。

作者

Tom Christiansen