Sub::Util - 用于子程序和 CODE 引用的一组实用子程序
use Sub::Util qw( prototype set_prototype subname set_subname );
Sub::Util
包含一组用于操作子程序和 CODE 引用 的实用子程序。
包含在这个模块中的理由是,该函数执行了一些需要 XS 实现才能完成的工作,因为这些工作无法用纯 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 <[email protected]> 编写。
XS 实现的 "set_subname" 来自 Matthijs van Duin <[email protected]> 编写的 Sub::Name。