內容

名稱

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 )

其中 ACCESSFcntl 模組中的 S_IRUSRS_IWUSRS_IXUSR 之一,而 EFFECTIVE 指示是否使用有效(true)或實際(false)id。此方法會詮釋 modeuidgid 欄位,並傳回目前程序是否被允許指定存取。

如果您不想使用物件,您可以將 ->cando 方法匯入您的命名空間,作為一個名為 stat_cando 的常規函數。這會將包含 statlstat 回傳值的陣列參考作為其第一個引數,並為您解釋它。

您也可以使用 :FIELDS 匯入標籤,將所有結構欄位直接匯入您的命名空間作為常規變數。(請注意,這仍然會覆寫您的 stat() 和 lstat() 函數。)使用在方法名稱前面加上 st_ 的變數名稱存取這些欄位。因此,如果您匯入欄位,則 $stat_obj->dev() 對應到 $st_dev。

若要存取此功能而不會覆寫核心,請傳遞 use 一個空的匯入清單,然後使用其完整限定名稱存取函數函數。另一方面,內建函數仍然可透過 CORE:: 偽套件取得。

BUGS

自 Perl 5.8.0 起,在使用此模組後,您無法在 stat() 或 lstat() 中使用隱含的 $_ 或特殊檔案句柄 _,嘗試這麼做會導致奇怪的錯誤。解決方法是讓 $_ 明確

my $stat_obj = stat $_;

並讓 _ 使用未匯出且未記錄的 populate() 函數和 CORE::stat() 明確填入物件

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

ERRORS

-%s 未在 File::stat 物件上實作

檔案測試運算子 -t-T-B 未實作,因為它們需要比 stat 緩衝區更多的資訊。

WARNINGS

這些都可以使用以下方式停用

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

您已嘗試使用其中一個 -rwxRWX 檔案測試,並在 use filetest 'access' 中生效。File::stat 會忽略實用程式,並像往常一樣僅使用 mode 成員中的資訊。

File::stat 忽略 VMS ACL

VMS 系統具有無法在 stat 緩衝區中完全表示的權限結構,而且與其他系統不同,內建檔案測試運算子會尊重這一點。然而,File::stat 重載不會,因為所需的資訊不可用。

NOTE

雖然此類別目前使用 Class::Struct 模組實作來建立類 struct 的類別,但您不應依賴於此。

AUTHOR

湯姆·克里斯蒂安森