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_IRUSR
、S_IWUSR
或 S_IXUSR
之一,而 EFFECTIVE 指示是否使用有效(true)或真实(false) ID。该方法解释 mode
、uid
和 gid
字段,并返回当前进程是否被允许指定访问权限。
如果您不想使用这些对象,可以将 ->cando
方法导入到您的命名空间中,作为名为 stat_cando
的常规函数。它以包含 stat
或 lstat
返回值的数组引用作为其第一个参数,并为您解释它。
您也可以使用 :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(_));
文件测试运算符 -t
、-T
和 -B
未实现,因为它们需要比 stat 缓冲区更多的信息。
所有这些都可以通过以下方式禁用
no warnings "File::stat";
您尝试在 use filetest 'access'
生效的情况下使用 -rwxRWX
文件测试之一。File::stat
将忽略此 pragma,并像往常一样仅使用 mode
成员中的信息。
VMS 系统具有无法在 stat 缓冲区中完全表示的权限结构,并且与其他系统不同,内置文件测试运算符会尊重这一点。但是,File::stat
重载不会,因为所需的信息不可用。
虽然此类目前使用 Class::Struct 模块来构建类似结构的类,但您不应该依赖于此。
Tom Christiansen