內容

名稱

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 的文件。

建構函式

new ()

建立新的 IO::Handle 物件。

new_from_fd ( FD, MODE )

建立一個 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,您可能需要這些

$io->fdopen ( FD, MODE )

fdopen 就像一般的 open,只不過它的第一個參數不是檔案名稱,而是檔案句柄名稱、IO::Handle 物件或檔案描述符號碼。(有關 open 方法的文件,請參閱 IO::File。)

$io->opened

如果物件目前是有效的檔案描述符,則傳回 true,否則傳回 false。

$io->getline

這個運作方式就像 "perlop 中的 I/O 算子" 中所述的 <$io>,只不過它更易於閱讀,而且可以在清單內容中安全呼叫,但仍然只傳回一行。不過,如果在 while 或 C 風格的 for 迴圈中用作條件式,您將需要使用 defined($_ = $io->getline) 模擬 <$io> 的功能。

$io->getlines

這個運作方式就像 <$io>,當在清單內容中呼叫以讀取檔案中所有剩餘的行時,只不過它更易於閱讀。如果意外在純量內容中呼叫,它也會 croak()。

$io->ungetc ( ORD )

將具有給定序數值的字元推回給定句柄的輸入串流。每個句柄只保證推回一個字元。

$io->write ( BUF, LEN [, OFFSET ] )

這個 write 有點像 C 中的 write,因為它與 read 相反。perl write 函式的 wrapper 稱為 format_write。然而,C write 函式會傳回寫入的位元組數,而這個 write 函式如果成功,只會傳回 true(像 print)。更像 C 的 writesyswrite(請見上方)。

$io->error

如果給定的控制代碼自開啟以來或自上次呼叫 clearerr 以來發生任何錯誤,或如果控制代碼無效,則傳回 true 值。它只會對沒有未解決錯誤的有效控制代碼傳回 false。

$io->clearerr

清除給定控制代碼的錯誤指標。如果控制代碼無效,則傳回 -1,否則傳回 0。

$io->sync

sync 會將檔案的記憶體中狀態與實體媒體上的狀態同步。sync 沒有在 perlio api 層級運作,而是作用於檔案描述符(類似於 sysread、sysseek 和 systell)。這表示在 perlio api 層級保留的任何資料都不會同步。若要同步在 perlio api 層級緩衝的資料,您必須使用 flush 方法。並非所有平台都實作 sync。成功時傳回「0 但為 true」,錯誤時傳回 undef,無效控制代碼傳回 undef。請參閱 fsync(3c)

$io->flush

flush 會導致 perl 清除 perlio api 層級中任何緩衝的資料。緩衝區中任何未讀取的資料都將捨棄,任何未寫入的資料都將寫入基礎檔案描述符。成功時傳回「0 但為 true」,錯誤時傳回 undef

$io->printflush ( ARGS )

開啟自動快取,列印 ARGS,然後還原 IO::Handle 物件的自動快取狀態。傳回列印的傳回值。

$io->blocking ( [ BOOL ] )

如果呼叫時帶有引數 blocking,如果 BOOL 為 false,則會開啟非封鎖 IO,如果 BOOL 為 true,則會關閉非封鎖 IO。

blocking 會傳回先前設定的值,或者如果未提供 BOOL,則會傳回目前設定。

如果發生錯誤,blocking 會傳回 undef,而且會設定 $!

如果 C 函式 setbuf() 和/或 setvbuf() 可用,則 IO::Handle::setbufIO::Handle::setvbuf 會設定 IO::Handle 的快取原則。Perl 函式的呼叫順序與其 C 對應函式相同,包括 setvbuf() 的常數 _IOFBF_IOLBF_IONBF,但緩衝區參數會指定要作為緩衝區使用的純量變數。您只應該在任何 I/O 之前或呼叫 flush 之後立即變更緩衝區。

警告:預設情況下,Perl 5.8.0 和更新版本中不提供 IO::Handle::setvbuf(),因為 setvbuf() 非常特定於使用 stdio 函式庫,而 Perl 則偏好使用新的 perlio 子系統。

警告:setbufsetvbuf 用作緩衝區的變數在 IO::Handle 關閉或再次呼叫 setbufsetvbuf 之前不得以任何方式修改,否則可能會導致記憶體損毀!請記住,全域毀損的順序是未定義的,因此即使緩衝區變數在程式終止之前都保持在範圍內,它也可能在 IO::Handle 檔案關閉之前未定義。請注意,您需要明確匯入常數 _IOFBF_IOLBF_IONBF。與 C 類似,setbuf 不會傳回任何內容。setvbuf 會在成功時傳回「0 但為 true」,在失敗時傳回 undef

最後,有一個特殊方法可用於在 -T 和 setuid/gid 腳本中執行

$io->untaint

將物件標記為未受污染,因此從中讀取的資料也會被視為未受污染。請注意,這是一個非常值得信賴的動作,而且應考慮資料來源和潛在漏洞。如果成功,則傳回 0,如果設定未受污染標記失敗,則傳回 -1。(例如,無效的控制代碼)

注意

IO::Handle 物件是符號/GLOB 參考的參考(請參閱 Symbol 套件)。繼承自 IO::Handle 的一些模組可能想要將物件相關變數保存在 GLOB 的雜湊表部分。為了防止模組互相踐踏,我建議任何此類模組都應使用自己的名稱加上底線 '_' 來作為其變數的前綴。例如,IO::Socket 模組在 'io_socket_timeout' 中保留一個 timeout 變數。

另請參閱

perlfuncperlop 中的「I/O 算子」IO::File

錯誤

由於向後相容性,所有檔案句柄都類似於 IO::Handle 類別的物件,或實際上是從該類別衍生的類別。它們實際上並非如此。這表示您無法從 IO::Handle 衍生自己的類別並繼承那些方法。

歷程

由 Graham Barr <gbarr@pobox.com> 從 FileHandle.pm 衍生而來