内容

名称

Sub::Util - 用于子程序和 CODE 引用的一组实用子程序

概要

use Sub::Util qw( prototype set_prototype subname set_subname );

描述

Sub::Util 包含一组用于操作子程序和 CODE 引用 的实用子程序。

包含在这个模块中的理由是,该函数执行了一些需要 XS 实现才能完成的工作,因为这些工作无法用纯 Perl 实现,并且在 CPAN 中被广泛使用,因此其流行程度值得将其包含在核心模块中,而这正是它所处的。

函数

prototype

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__作为本地名称。如果编译代码的包已被删除(例如,使用来自Symboldelete_package),则__ANON__将作为包名返回。如果使用"set_subname"设置了名称,则将返回此名称。

此函数的灵感来自Sub::Identify中的sub_fullnameSub::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 <[email protected]> 编写。

XS 实现的 "set_subname" 来自 Matthijs van Duin <[email protected]> 编写的 Sub::Name