IO::Handle - 提供 I/O 句柄的物件方法
use IO::Handle;
my $io = IO::Handle->new();
if ($io->fdopen(fileno(STDIN),"r")) {
print $io->getline;
$io->close;
}
my $io = IO::Handle->new();
if ($io->fdopen(fileno(STDOUT),"w")) {
$io->print("Some text\n");
}
# setvbuf is not available by default on Perls 5.8.0 and later.
use IO::Handle '_IOLBF';
$io->setvbuf(my $buffer_var, _IOLBF, 1024);
undef $io; # automatically closes the file if it's open
autoflush STDOUT 1;
IO::Handle
是所有其他 IO 句柄類別的基礎類別。IO::Handle
的物件並非用於直接建立,而是由 IO 層級中的其他類別繼承 IO::Handle
。
如果您正在閱讀此文件,並尋找 FileHandle
套件的替代品,建議您也閱讀 IO::File
的文件。
建立新的 IO::Handle
物件。
建立一個 IO::Handle
,就像 new
一樣。它需要兩個參數,傳遞給 fdopen
方法;如果 fdopen 失敗,則物件會被銷毀。否則,它會傳回給呼叫者。
請參閱 perlfunc,以取得以下每個受支援 IO::Handle
方法的完整說明,它們只是對應內建函式的前端
$io->close
$io->eof
$io->fcntl( FUNCTION, SCALAR )
$io->fileno
$io->format_write( [FORMAT_NAME] )
$io->getc
$io->ioctl( FUNCTION, SCALAR )
$io->read ( BUF, LEN, [OFFSET] )
$io->print ( ARGS )
$io->printf ( FMT, [ARGS] )
$io->say ( ARGS )
$io->stat
$io->sysread ( BUF, LEN, [OFFSET] )
$io->syswrite ( BUF, [LEN, [OFFSET]] )
$io->truncate ( LEN )
請參閱 perlvar,以取得以下每個受支援 IO::Handle
方法的完整說明。它們全部傳回屬性的前一個值,並接受一個選用的單一參數,在給定的時候會設定值。如果沒有給定參數,前一個值不會改變(除了 $io->autoflush 會預設實際開啟自動快取)。
$io->autoflush ( [BOOL] ) $|
$io->format_page_number( [NUM] ) $%
$io->format_lines_per_page( [NUM] ) $=
$io->format_lines_left( [NUM] ) $-
$io->format_name( [STR] ) $~
$io->format_top_name( [STR] ) $^
$io->input_line_number( [NUM]) $.
以下方法不受每個檔案句柄支援。
IO::Handle->format_line_break_characters( [STR] ) $:
IO::Handle->format_formfeed( [STR]) $^L
IO::Handle->output_field_separator( [STR] ) $,
IO::Handle->output_record_separator( [STR] ) $\
IO::Handle->input_record_separator( [STR] ) $/
此外,要執行一般 I/O,您可能需要這些
fdopen
就像一般的 open
,只不過它的第一個參數不是檔案名稱,而是檔案句柄名稱、IO::Handle 物件或檔案描述符號碼。(有關 open
方法的文件,請參閱 IO::File。)
如果物件目前是有效的檔案描述符,則傳回 true,否則傳回 false。
這個運作方式就像 "perlop 中的 I/O 算子" 中所述的 <$io>,只不過它更易於閱讀,而且可以在清單內容中安全呼叫,但仍然只傳回一行。不過,如果在 while
或 C 風格的 for
迴圈中用作條件式,您將需要使用 defined($_ = $io->getline)
模擬 <$io> 的功能。
這個運作方式就像 <$io>,當在清單內容中呼叫以讀取檔案中所有剩餘的行時,只不過它更易於閱讀。如果意外在純量內容中呼叫,它也會 croak()。
將具有給定序數值的字元推回給定句柄的輸入串流。每個句柄只保證推回一個字元。
這個 write
有點像 C 中的 write
,因為它與 read 相反。perl write
函式的 wrapper 稱為 format_write
。然而,C write
函式會傳回寫入的位元組數,而這個 write
函式如果成功,只會傳回 true(像 print
)。更像 C 的 write
是 syswrite
(請見上方)。
如果給定的控制代碼自開啟以來或自上次呼叫 clearerr
以來發生任何錯誤,或如果控制代碼無效,則傳回 true 值。它只會對沒有未解決錯誤的有效控制代碼傳回 false。
清除給定控制代碼的錯誤指標。如果控制代碼無效,則傳回 -1,否則傳回 0。
sync
會將檔案的記憶體中狀態與實體媒體上的狀態同步。sync
沒有在 perlio api 層級運作,而是作用於檔案描述符(類似於 sysread、sysseek 和 systell)。這表示在 perlio api 層級保留的任何資料都不會同步。若要同步在 perlio api 層級緩衝的資料,您必須使用 flush 方法。並非所有平台都實作 sync
。成功時傳回「0 但為 true」,錯誤時傳回 undef
,無效控制代碼傳回 undef
。請參閱 fsync(3c)。
flush
會導致 perl 清除 perlio api 層級中任何緩衝的資料。緩衝區中任何未讀取的資料都將捨棄,任何未寫入的資料都將寫入基礎檔案描述符。成功時傳回「0 但為 true」,錯誤時傳回 undef
。
開啟自動快取,列印 ARGS,然後還原 IO::Handle
物件的自動快取狀態。傳回列印的傳回值。
如果呼叫時帶有引數 blocking
,如果 BOOL
為 false,則會開啟非封鎖 IO,如果 BOOL
為 true,則會關閉非封鎖 IO。
blocking
會傳回先前設定的值,或者如果未提供 BOOL
,則會傳回目前設定。
如果發生錯誤,blocking
會傳回 undef,而且會設定 $!
。
如果 C 函式 setbuf() 和/或 setvbuf() 可用,則 IO::Handle::setbuf
和 IO::Handle::setvbuf
會設定 IO::Handle 的快取原則。Perl 函式的呼叫順序與其 C 對應函式相同,包括 setvbuf() 的常數 _IOFBF
、_IOLBF
和 _IONBF
,但緩衝區參數會指定要作為緩衝區使用的純量變數。您只應該在任何 I/O 之前或呼叫 flush 之後立即變更緩衝區。
警告:預設情況下,Perl 5.8.0 和更新版本中不提供 IO::Handle::setvbuf(),因為 setvbuf() 非常特定於使用 stdio 函式庫,而 Perl 則偏好使用新的 perlio 子系統。
警告:setbuf
或 setvbuf
用作緩衝區的變數在 IO::Handle 關閉或再次呼叫 setbuf
或 setvbuf
之前不得以任何方式修改,否則可能會導致記憶體損毀!請記住,全域毀損的順序是未定義的,因此即使緩衝區變數在程式終止之前都保持在範圍內,它也可能在 IO::Handle 檔案關閉之前未定義。請注意,您需要明確匯入常數 _IOFBF
、_IOLBF
和 _IONBF
。與 C 類似,setbuf 不會傳回任何內容。setvbuf 會在成功時傳回「0 但為 true」,在失敗時傳回 undef
。
最後,有一個特殊方法可用於在 -T 和 setuid/gid 腳本中執行
將物件標記為未受污染,因此從中讀取的資料也會被視為未受污染。請注意,這是一個非常值得信賴的動作,而且應考慮資料來源和潛在漏洞。如果成功,則傳回 0,如果設定未受污染標記失敗,則傳回 -1。(例如,無效的控制代碼)
IO::Handle
物件是符號/GLOB 參考的參考(請參閱 Symbol 套件)。繼承自 IO::Handle
的一些模組可能想要將物件相關變數保存在 GLOB 的雜湊表部分。為了防止模組互相踐踏,我建議任何此類模組都應使用自己的名稱加上底線 '_' 來作為其變數的前綴。例如,IO::Socket 模組在 'io_socket_timeout' 中保留一個 timeout
變數。
perlfunc、perlop 中的「I/O 算子」、IO::File
由於向後相容性,所有檔案句柄都類似於 IO::Handle
類別的物件,或實際上是從該類別衍生的類別。它們實際上並非如此。這表示您無法從 IO::Handle
衍生自己的類別並繼承那些方法。
由 Graham Barr <gbarr@pobox.com> 從 FileHandle.pm 衍生而來