內容

名稱

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 算子相同;它包含在這裡只是為了對稱性和完整性,與其他函式相符。

set_prototype

my $code = set_prototype $prototype, $code;

自版本 1.40 起。

設定由 $code 參照給定的函式的原型,或是在 $prototypeundef 時刪除它。傳回 $code 參照本身。

注意:此函式採用與從 Scalar::Util 複製的先前程式碼不同的順序來取得引數。這是為了符合 set_subname 的順序,以及此檔案中其他潛在的附加內容。選擇此順序是因為它允許其他 Sub::Util::set_* 函式整齊且簡單地串連,例如

my $code =
   set_subname   name_here =>
   set_prototype '&@'      =>
   set_attribute ':lvalue' =>
      sub { ...... };

subname

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"

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 複製。