binmode FILEHANDLE, LAYER
binmode FILEHANDLE

安排 FILEHANDLE 在執行時期函式庫區分二進位和文字檔案的系統上以「二進位」或「文字」模式讀取或寫入。如果 FILEHANDLE 是表達式,則其值會視為檔案代號的名稱。成功時傳回 true,否則傳回 undef 並設定 $! (errno)。

在某些系統上(通常是 DOS 和 Windows 系統),當您不使用文字檔案時,binmode 是必要的。為了可攜性,最好在適當的時候使用它,不適當的時候則不要使用。此外,人們可以設定他們的 I/O 預設為 UTF8 編碼的 Unicode,而不是位元組。

換句話說:不論平台為何,請對二進位資料(例如影像)使用 binmode

如果 LAYER 存在,它是一個單一字串,但可能包含多個指令。這些指令會改變檔案代號的行為。當 LAYER 存在時,對文字檔案使用 binmode 是有意義的。

如果省略 LAYER 或指定為 :raw,則檔案代號會適合傳遞二進位資料。這包括關閉可能的 CRLF 轉換並將其標記為位元組(而不是 Unicode 字元)。請注意,儘管 「Perl 程式設計」(Camel,第 3 版)或其他地方可能暗示,:raw 並非 :crlf 的反向操作。其他會影響串流二進位性質的層級也會停用。請參閱 PerlIO,以及 perlrun 中關於 PERLIO 環境變數的討論。

:bytes:crlf:utf8 和任何其他格式為 :... 的指令稱為 I/O 層級。可以使用 open 實用程式來建立預設 I/O 層級。

在「Programming Perl, 第 3 版」中,binmode 函式的 LAYER 參數被描述為「DISCIPLINE」。然而,自從這本書出版以來(許多人稱之為「Camel III」),這個功能的命名共識已從「discipline」轉移到「layer」。因此,這個版本的 Perl 所有文件都提到「layers」,而不是「disciplines」。現在回到定期排程的文件...

若要將 FILEHANDLE 標記為 UTF-8,請使用 :utf8:encoding(UTF-8):utf8 僅將資料標記為 UTF-8,而不會進一步檢查,而 :encoding(UTF-8) 則會檢查資料是否實際上為有效的 UTF-8。可在 PerlIO::encoding 中找到更多詳細資訊。

一般來說,應在 open 之後,但在對檔案處理執行任何 I/O 之前,呼叫 binmode。呼叫 binmode 通常會清除處理中任何待處理的緩衝輸出資料(以及可能待處理的輸入資料)。例外情況是 :encoding 層,它會變更處理的預設字元編碼。有時需要在串流中呼叫 :encoding 層,而且它不會清除串流。:encoding 也會隱含地將 :utf8 層推送到其上方,因為 Perl 內部會對 UTF8 編碼的 Unicode 字元執行操作。

作業系統、裝置驅動程式、C 函式庫和 Perl 執行時期系統都會共謀,讓程式設計人員將單一字元(\n)視為換行符號,而與外部表示無關。在許多作業系統上,原生文字檔案表示與內部表示相符,但在某些平台上,\n 的外部表示會由多個字元組成。

Unix、Mac OS(舊版和新版)的所有變體,以及 VMS 上的 Stream_LF 檔案,都會使用單一字元來結束文字的外部表示中的每一行(即使在舊版的 Mac OS(Darwin 之前)中,該單一字元是回車,而在 Unix 和大多數 VMS 檔案中則是換行)。在其他系統(例如 OS/2、DOS 和各種版本的 MS-Windows)中,您的程式會將 \n 視為單純的 \cJ,但儲存在文字檔案中的是兩個字元 \cM\cJ。這表示如果您沒有在這些系統上使用 binmode,磁碟上的 \cM\cJ 序列在輸入時會轉換為 \n,而程式中的任何 \n 在輸出時都會轉換回 \cM\cJ。這是您對文字檔案的期望,但對二進位檔案來說可能是災難性的。

使用 binmode(在某些系統上)的另一個後果是,特殊檔案結束標記將視為資料串流的一部分。對於 Microsoft 系列的系統,這表示如果您的二進位資料包含 \cZ,除非您使用 binmode,否則 I/O 子系統會將其視為檔案結束。

binmode 不僅對 readlineprint 作業很重要,在使用 readseeksysreadsyswritetell 時也很重要(有關更多詳細資訊,請參閱 perlport)。請參閱 $/$\ 變數中的 perlvar,以了解如何手動設定您的輸入和輸出換行序列。

可攜性問題:"perlport 中的 binmode"