目錄

名稱

FileHandle - 為檔案句柄提供物件方法

語法

use FileHandle;

my $fh = FileHandle->new;
if ($fh->open("< file")) {
    print <$fh>;
    $fh->close;
}

my $fh = FileHandle->new("> FOO");
if (defined $fh) {
    print $fh "bar\n";
    $fh->close;
}

my $fh = FileHandle->new("file", "r");
if (defined $fh) {
    print <$fh>;
    undef $fh;       # automatically closes the file
}

my $fh = FileHandle->new("file", O_WRONLY|O_APPEND);
if (defined $fh) {
    print $fh "corge\n";
    undef $fh;       # automatically closes the file
}

my $pos = $fh->getpos;
$fh->setpos($pos);

$fh->setvbuf(my $buffer_var, _IOLBF, 1024);

my ($readfh, $writefh) = FileHandle::pipe;

autoflush STDOUT 1;

說明

注意:此類別現在是 IO::* 類別的前端。

FileHandle::new 會建立一個 FileHandle,它是一個指向新建立符號的參考(請參閱 Symbol 套件)。如果它收到任何參數,這些參數會傳遞給 FileHandle::open;如果開啟失敗,FileHandle 物件會被銷毀。否則,它會傳回給呼叫者。

FileHandle::new_from_fd 會建立一個 FileHandle,就像 new 所做的一樣。它需要兩個參數,這些參數會傳遞給 FileHandle::fdopen;如果 fdopen 失敗,FileHandle 物件會被銷毀。否則,它會傳回給呼叫者。

FileHandle::open 接受一個或兩個參數。使用一個參數時,它只是一個內建 open 函式的前端。使用兩個參數時,第一個參數是一個可能包含空白或其他特殊字元的檔名,第二個參數是開啟模式,後面可以選擇性地加上一個檔案權限值。

如果 FileHandle::open 收到一個 Perl 模式字串(">"、"+<" 等)或一個 POSIX fopen() 模式字串("w"、"r+" 等),它會使用基本的 Perl open 運算子。

如果 FileHandle::open 收到一個數字模式,它會將該模式和選擇性的權限值傳遞給 Perl sysopen 運算子。為了方便,FileHandle::import 會嘗試從 Fcntl 模組匯入 O_XXX 常數。如果動態載入不可用,這可能會失敗,但 FileHandle 的其他部分仍然會正常運作。

FileHandle::fdopen 就像 open,只不過它的第一個參數不是檔名,而是檔案句柄名稱、FileHandle 物件或檔案描述符號碼。

如果 C 函數 fgetpos() 和 fsetpos() 可用,則 FileHandle::getpos 會傳回一個不透明值,表示 FileHandle 的目前位置,而 FileHandle::setpos 會使用該值來返回先前拜訪過的位置。

如果 C 函數 setvbuf() 可用,則 FileHandle::setvbuf 會設定 FileHandle 的緩衝政策。Perl 函數的呼叫順序與其 C 對應項相同,包括巨集 _IOFBF_IOLBF_IONBF,但緩衝參數指定要作為緩衝使用的純量變數。警告:由 FileHandle::setvbuf 作為緩衝使用的變數,在 FileHandle 關閉或再次呼叫 FileHandle::setvbuf 之前,不得以任何方式修改,否則可能會導致記憶體損毀!

請參閱 perlfunc,以取得以下每個受支援的 FileHandle 方法的完整說明,它們只是對應內建函數的前端

close
fileno
getc
gets
eof
clearerr
seek
tell

請參閱 perlvar,以取得以下每個受支援的 FileHandle 方法的完整說明

autoflush
output_field_separator
output_record_separator
input_record_separator
input_line_number
format_page_number
format_lines_per_page
format_lines_left
format_name
format_top_name
format_line_break_characters
format_formfeed

此外,對於執行正常的 I/O,您可能需要這些

$fh->print

請參閱 perlfunc 中的「print」

$fh->printf

請參閱 perlfunc 中的「printf」

$fh->getline

這就像 perlop 中的「I/O 算子」 中所述的 <$fh>,但它更易於閱讀,且可以在清單內容中安全呼叫,但仍只傳回一行。

$fh->getlines

這就像在清單內容中呼叫 <$fh> 以讀取檔案中所有剩餘行時一樣,但它更易於閱讀。如果意外在純量內容中呼叫它,它也會 croak()。

還有許多其他函數可用,因為 FileHandle 是從 IO::File、IO::Seekable 和 IO::Handle 衍生而來的。請參閱這些各自的頁面,以取得更多函數的說明文件。

另請參閱

IO 擴充模組,perlfuncperlop 中的「I/O 運算子」