開啟檔案,其檔名由 FILENAME 給出,並將其與 FILEHANDLE 關聯。如果 FILEHANDLE 是表達式,其值將用作想要的真實檔案句柄;未定義的純量將適當地自動化。此函式呼叫底層作業系統的 open(2) 函式,其參數為 FILENAME、MODE 和 PERMS。
成功時傳回 true,否則傳回 undef
。
PerlIO 層會套用在句柄上,其方式與在未指定層的 open
呼叫中相同。也就是說,${^OPEN}
的目前值,由 open 實用範例在詞彙範圍內設定,或在主程式範圍內設定 -C
命令列選項或 PERL_UNICODE
環境變數,退而求其次,使用 "PerlIO 中的預設值和如何覆寫它們" 中所述的平台預設值。如果您想要移除任何可能轉換位元組串流的層,請在開啟後使用 binmode
。
MODE 參數的可能值和旗標位元取決於系統;它們可透過標準模組 Fcntl
取得。請參閱作業系統的 open(2) 系統呼叫文件,以查看有哪些值和旗標位元可用。您可以使用 |
運算子組合多個旗標。
最常見的一些值包括用於以唯讀模式開啟檔案的 O_RDONLY
、用於以唯寫模式開啟檔案的 O_WRONLY
以及用於以讀寫模式開啟檔案的 O_RDWR
。
由於歷史原因,有些值幾乎可以在 Perl 支援的所有系統上執行:0 表示唯讀,1 表示唯寫,2 表示讀寫。我們知道這些值在 OS/390 下無法執行;您可能不希望在新的程式碼中使用它們。
如果 FILENAME 指定的檔案不存在,而 open
呼叫建立了該檔案(通常是因為 MODE 包含 O_CREAT
旗標),則 PERMS 的值會指定新建立檔案的權限。如果您省略 sysopen
的 PERMS 參數,Perl 會使用八進位值 0666
。這些權限值需要以八進位表示,並會受到您目前的程序 umask
所修改。
在許多系統中,O_EXCL
旗標可用於以獨佔模式開啟檔案。這不是鎖定:獨佔性在此表示如果檔案已存在,則 sysopen
會失敗。O_EXCL
可能無法在網路檔案系統上執行,而且除非 O_CREAT
旗標也設定,否則不會產生任何效果。設定 O_CREAT|O_EXCL
可防止檔案在為符號連結時被開啟。它無法防範檔案路徑中的符號連結。
有時您可能想要截斷已存在的檔案。這可以使用 O_TRUNC
旗標來完成。O_TRUNC
與 O_RDONLY
搭配使用的行為未定義。
您很少會將 0644
用作 sysopen
的參數,因為這樣會取消使用者擁有更寬鬆 umask 的選項。最好省略它。請參閱 umask
以進一步瞭解這一點。
此函數與 sysread
、syswrite
或 sysseek
的使用沒有直接關係。使用此函數開啟的控制代碼可以用於緩衝 IO,就像使用 open
開啟的控制代碼可以用於非緩衝 IO 一樣。
請注意,在早於 5.8.0 的 Perl 中,sysopen
取決於 C 函式庫函數 fdopen(3)
。在許多 Unix 系統上,已知 fdopen(3)
在檔案描述符超過特定值(通常為 255)時會失敗。如果您需要超過該數量的檔案描述符,請考慮使用 POSIX::open
函數。對於 Perl 5.8.0 和更新版本,PerlIO(通常)是預設值。
請參閱 perlopentut
以取得更親切、更友善的開啟檔案說明。
移植性問題:perlport 中的「sysopen」。