安排 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
不僅對 readline
和 print
作業很重要,在使用 read
、seek
、sysread
、syswrite
和 tell
時也很重要(有關更多詳細資訊,請參閱 perlport)。請參閱 $/
和 $\
變數中的 perlvar,以了解如何手動設定您的輸入和輸出換行序列。
可攜性問題:"perlport 中的 binmode"。