如何在Perl中检查给定参数是否为子程序?
在Perl中判断参数是否为子程序引用
要实现你示例里的is_subroutine函数,Perl里有两种常用方式,根据场景选择即可:
基础实现(适用于大多数普通场景)
直接用ref函数判断引用类型,子程序引用的ref返回值是CODE:
sub is_subroutine { my $arg = shift; # 先判断参数是否定义,再检查引用类型 return defined $arg && ref($arg) eq 'CODE'; }
更可靠的实现(处理被 bless 的对象场景)
如果遇到被bless过的对象且重载了&{}运算符,ref会返回类名而非CODE,这时候用核心模块Scalar::Util的reftype函数能获取底层引用类型:
use Scalar::Util 'reftype'; sub is_subroutine { my $arg = shift; return defined $arg && reftype($arg) eq 'CODE'; }
完整示例代码
把is_subroutine整合到你的代码里,测试效果和预期一致:
use Scalar::Util 'reftype'; sub is_subroutine { my $arg = shift; return defined $arg && reftype($arg) eq 'CODE'; } sub foo { my $bar = shift; if (is_subroutine($bar)) { return &$bar(); } return 0; } # 测试调用 foo(sub { print "Hi!" }); # 输出 "Hi!" foo(123); # 无输出
简单总结:普通场景用ref判断就够,要兼容对象重载的情况就用Scalar::Util的reftype,后者是更严谨的方案。
内容的提问来源于stack exchange,提问作者Rawley Fowler
相关产品推荐
相关产品推荐

