想知道 Perl 中的句柄是什么。
我可以看到檔案句柄、目錄句柄..等,但想知道 Perl 中句柄的含義。
例如,在 IO::Pipe 中,我可以看到下面的解釋。并想明確“成為手柄”的含義?
reader ([ARGS])
The object is re-blessed into a sub-class of IO::Handle,
and becomes a handle at the reading end of the pipe. If
ARGS are given then fork is called and ARGS are passed
to exec.
另外,請您解釋一下祝福的含義嗎?
uj5u.com熱心網友回復:
句柄是一種到達某物的方法,而不是真正成為那個東西。句柄有一個介面來與系統管理的東西(或其他東西)進行互動。
從標量的概念開始。定義一個簡單的標量存盤一個值,該值實際上在程式的記憶體中。用非常簡單的術語來說,您可以直接在您的程式中完全管理該資源。您無需要求系統為您增加變數:
my $n = 5;
$n ;
與外界對話
句柄表示與由其他事物管理的事物的連接,通常通過“系統呼叫”。
檔案句柄是您與檔案的連接(因此,由檔案系統或作業系統管理),但不是檔案本身。使用該檔案句柄,您可以讀取或寫入檔案,所有這些背后都有代碼可以與系統對話以完成實際作業。
open my $filehandle, '<', $filename or die "$!";
由于您沒有管理實際作業,并且由于您依賴系統來完成作業,因此您檢查$!系統錯誤變數以檢查系統是否能夠執行您想要的操作。如果不能,它會告訴您它是如何遇到問題的(盡管錯誤可能不是很具體)。
目錄句柄是一種獲取目錄內事物串列的方法,但不是目錄本身。為此,您必須要求系統為您做事。等等。
Perl 很棒
但是,在 Perl 中,你可以處理任何你喜歡的東西(我在Effective Perl Programming和Mastering Perl中寫了很多關于這個的東西。即使你完全控制了這個東西,你也可以使用這個介面來處理它而不是需要要求系統代表您做某事。
例如,您可以在字串上使用檔案句柄介面:
open my $string_filehandle, '>', \my $string;
print {$string_filehandle} "This goes to the string";
對于您閱讀的代碼,它看起來像是一個檔案(套接字,無論如何),因為主要使用句柄介面。當您被束縛于使用檔案句柄時,這非常方便,因為其他人撰寫了一些您無法更改的代碼。此函式旨在僅發送$message到某些輸出句柄:
sub print_to_file_only {
my( $filehandle, $message ) = @_;
print {$filehandle} $message;
}
但有時您不希望該訊息發送到終端、檔案、套接字或其他任何地方。你想在我的程式中看到它。您可以在您的訊息中捕獲訊息,$string_filehandle因為它使用相同的句柄介面,即使它不是靜態資源。
print_to_file_only( $string_filehandle );
現在您會看到訊息顯示在 中$string,您可以對它做任何您喜歡的事情。
像這樣的技巧還有很多,我很想談論所有這些技巧。但是,這應該是一個好的開始。
uj5u.com熱心網友回復:
這可能是一個非常廣泛的話題,我將嘗試抓住問題的癥結所在,在IO::Pipe docs 參考的一行中捕獲,需要解釋
該物件被重新祝福為 的子類
IO::Handle,并成為管道讀取端的句柄。
Perl 中的“句柄”是圍繞某些資源構建的結構,在作業系統或我們的程式中,它允許我們管理該資源。例如,檔案句柄可能有助于通過庫和作業系統工具訪問檔案,并且不僅僅是一個普通的檔案描述符
use warnings;
use strict;
use feature 'say';
my $file = shift // die "Usage: $0 file\n";
open my $fh, '<', $file or die "Can't open $file: $!";
say fileno $fh; # file descriptor, a small integer, normally >= 3
say $fh->fileno; # can use handle as object of IO::Handle or IO::File
close $fh;
打開的檔案在作業系統中有一個檔案描述符,一個小整數,第一個可用的。?但是我們得到了與打開的檔案關聯的“檔案句柄” $fh,它使用起來要好得多,并且可以使用各種工具。(fileno用于從中獲取 fd。)
在較新的 Perls(自 v5.14.0 起)中,(檔案)句柄實際上可以被視為IO::Handle或IO::File的物件,因為一旦在帶有句柄的變數(如果呼叫不能以其他方式解決)。?
這就把我們帶到了第二個問題,“再祝福”。
當一個參考被bless -ed 到一個包中時,它就成為該包(假定定義的類)的一個物件。因此,在其中完成的 sub 是一個建構式,并且這種“祝福”參考回傳給呼叫者。那是呼叫者中類的一個“實體”,一個物件。
物件的內部結構有欄位說明它來自哪個包,因此它會得到相應的處理,可以呼叫包中定義的方法,等等。這有點簡化,請參閱perlootut和perlobj了解初學者。
檔案中的參考來自類中的readerorwriter方法IO::Pipe。一旦在該類的物件上呼叫它們,物件從 具有設施就變得有益IO::Handle,因此它被“制成”為該類的物件。(不是IO::File類,因為管道在IO::File繼承時也是不可搜索IO::Seekable的。)
由于bless這是程序中至關重要且有說服力的部分,因此人們通常簡單地說它是“祝福”(或在這里“重新祝福”,因為它已經是另一個類的物件),但正如您從鏈接資源中看到的那樣,有一個更多的事情要做。
作為最后的評論,請注意“(檔案)句柄”可以完全打開檔案或套接字等作業系統資源以外的事物。例如,它可以被“捆綁”(參見perltie、Tie::Handle);或者,open ed 到一個標量(“記憶體檔案”)。§
? 如果STDIN// STDOUT( STDERRfd's 0,1,2) 沒有關閉并且這是第一個打開的東西,它會得到3
?IO::File繼承自 and IO::Handle,IO::Seekable只添加了幾個方法。大多數表示句柄的類,如IO::Pipeor IO::Select,都繼承自IO::Handle. 因此,它的檔案首先提供了對“句柄”可用內容的感覺。
§ 這不是一個完整的檔案句柄;試fileno一下(-1)。但它的表現足夠好,可以派上用場。一個例子:我在分叉的行程中使用它來在一個字串中累積一個子行程的列印,最后將它發送回父行程。這樣,它們就可以連貫地以某種順序記錄/列印。
# in a child
my $stdout;
open my $fh_stdout, '>', \$stdout or croak "Can't open var for write: $!";
my $fh_STDOUT = select $fh_stdout; # set as default, save old (STDOUT)
say "goes to string"; # winds up in $stdout (sent to parent in the end)
select $fh_STDOUT; # cna switch back (normally not needed in child)
當然,這可以通過其他方式完成(只需將訊息附加到字串),但這樣我們可以在句柄被選擇后使用普通列印作為默認值(并且也可以使用現有的子/庫等)。
uj5u.com熱心網友回復:
大多數語言以非常不同的方式創建變數和物件。在Perl中,它們非常相似。
Perl允許大多數型別的變數被 bless 功能標記為物件。
這賦予變數額外的權力來呼叫類中的方法。Perl將在該類中搜索該名稱的方法。如果您未能提供第二個引數給bless,它將使用當前包或類進行搜索。
在他們的IO::Pipe示例中,您呼叫IO::Pipe's new() 方法來獲取祝福物件。對他們來說,他們使用 fork() 和父類轉換(“re-blessed”)$pipe到作為讀取器IO::Pipe作業的方法呼叫的讀取器子類。子行程將它們轉換$pipe為寫入。現在他們可以通過管道從孩子到父母溝通。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/504236.html
