You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:08