Sub::Util - 一系列用於子常式和 CODE 參照的實用子常式
use Sub::Util qw( prototype set_prototype subname set_subname );
Sub::Util
包含一系列實用子常式,對於操作子常式和 CODE 參照很有用。
納入此模組的理由是,該函數執行某些工作,而 XS 實作對此至關重要,因為它無法在 Pure Perl 中實作,且在 CPAN 中使用廣泛,因此其受歡迎程度值得納入核心模組,也就是此模組。
my $proto = prototype( $code )
自版本 1.40 起。
如果給定的 $code
參照有原型,則以字串形式傳回該原型。這與 CORE::prototype
算子相同;它包含在這裡只是為了對稱性和完整性,與其他函式相符。
my $code = set_prototype $prototype, $code;
自版本 1.40 起。
設定由 $code
參照給定的函式的原型,或是在 $prototype
為 undef
時刪除它。傳回 $code
參照本身。
注意:此函式採用與從 Scalar::Util
複製的先前程式碼不同的順序來取得引數。這是為了符合 set_subname
的順序,以及此檔案中其他潛在的附加內容。選擇此順序是因為它允許其他 Sub::Util::set_*
函式整齊且簡單地串連,例如
my $code =
set_subname name_here =>
set_prototype '&@' =>
set_attribute ':lvalue' =>
sub { ...... };
my $name = subname( $code )
自版本 1.40 起。
如果給定的 $code
參照有名稱,則傳回該名稱。一般命名的子常式會提供一個完全限定的名稱,其中包含套件和使用 ::
分隔的本地名稱。匿名程式碼參照會將 __ANON__
作為本地名稱。如果編譯程式碼的套件已被刪除(例如使用 Symbol 中的 delete_package
),則會傳回 __ANON__
作為套件名稱。如果已使用 "set_subname" 設定名稱,則會傳回此名稱。
此函式是受到 Sub::Identify 中的 sub_fullname
啟發。Sub::Identify
實作的其餘函式可以使用正規表示式運算輕鬆模擬,例如
sub get_code_info { return (subname $_[0]) =~ m/^(.+)::(.*?)$/ }
sub sub_name { return (get_code_info $_[0])[0] }
sub stash_name { return (get_code_info $_[0])[1] }
Sub::Name 使用者請注意:此函式並非與 Sub::Name::subname
相同;它傳回子常式的現有名稱,而不是變更它。若要設定或變更名稱,請改看 "set_subname"。
my $code = set_subname $name, $code;
自版本 1.40 起。
設定由 $code
參照給定的函式的名稱。傳回 $code
參照本身。如果 $name
未限定,則使用呼叫者的套件來限定它。
這對於將名稱套用至匿名 CODE 參照很有用,以便堆疊追蹤和類似情況,提供有用的名稱,而不是使用預設的 __ANON__
。請注意,此名稱僅用於此情況;set_subname
不會將其安裝至符號表中;如果需要,您必須自行執行此動作。
然而,由於 Perl 僅將此名稱用作 caller
的傳回值,用於堆疊追蹤或類似情況,因此並不要求此名稱在語法上有效作為 Perl 函式名稱。這可用於附加額外的資訊,這在除錯堆疊追蹤時可能很有用。
此函式從 Sub::Name::subname
複製並重新命名為此模組的命名慣例。
此模組的一般結構是由 Paul Evans <leonerd@leonerd.org.uk> 編寫。
"set_subname" 的 XS 實作是由 Matthijs van Duin <xmath@cpan.org> 從 Sub::Name 複製。