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";
您已嘗試使用其中一個 -rwxRWX
檔案測試,並在 use filetest 'access'
中生效。File::stat
會忽略實用程式,並像往常一樣僅使用 mode
成員中的資訊。
VMS 系統具有無法在 stat 緩衝區中完全表示的權限結構,而且與其他系統不同,內建檔案測試運算子會尊重這一點。然而,File::stat
重載不會,因為所需的資訊不可用。
雖然此類別目前使用 Class::Struct 模組實作來建立類 struct 的類別,但您不應依賴於此。
湯姆·克里斯蒂安森