Perl--AUTOLOA(eval typeglob goto)


  • 正常情况下,不能调用一个尚未定义的子例程.

  • 不过,如果在包中定义有一个名为AUTOLOAD的子例程,那么调用这个AUTOLOAD子例程时会为它提供传入原子例程的同样的参数,也就是perl会把对未定义的子例程的调用全部转到AUTOLOAD上来.

  • AUTOLOAD中,可以定义返回值,也可以定义不存在的子例程,然后调用该子例程,就像这个子例程本来就存在一样.

使用AUTOLOAD需要理解下面的几点:

  • 原子例程的完全限定名(标识符前带包名和冒号)会出现在全局变量$AUTOLOAD中,与AUTOLOAD例程在同一个包中.
  • AUTOLOAD子例程中使用eval团赋值方式定义未定义的子例程.( 一分钟了解eval 理解类型团 )
  • 使用goto &NAME的跳入到AUTOLOAD定义的子例程.
  • 一旦子例程通过AUTOLOAD被定义,该子例程会保存在符号表中,可供再次调用.

代码展示

 #!/usr/bin/perl

use warnings;
use strict;

sub AUTOLOAD{
    our $AUTOLOAD;
    warn "attempt to call $AUTOLOAD\n";
    (my $method = $AUTOLOAD) =~ s/.*:://;

    if($method eq 'brag') {
    # no strict "refs";
    # *$method = sub {  ## 团赋值匿名子例程
    #     print shift;
    #     print "ok\n";
    # };
    eval q{ sub brag {my $n = shift; print "brag $n \n";} ## eval定义子例程
    goto &brag;
    }
}
&brag(20);
&brag(30);

如上代码输出结果

attempt to call main::brag ## 第一次程序进入AUTOLOAD
brag 20                    ## goto语句执行的结果
brag 30                    ## 第二次调用brag正常执行子例程
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值