当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Perl AUTOLOAD用法及代码示例


在Perl中,“自动加载”是在包中定义的例程或机制。使用简单。每当程序包中有未定义的例程被调用时,都会应用它。
如果没有自动加载,程序运行时未定义的例程将产生错误。要查找一个或多个软件包,将使用未定义子例程的参数调用自动加载子例程。

用法:要使用自动加载,只需将以下语法放入您的Perl程序中:

use vars '$AUTOLOAD';

参数:
在$Autoload中,原始子例程的名称出现在调用未定义函数的程序包的全局变量中。
在更新版本的Perl中,语法为


our $AUTOLOAD;

例:
这里看一下Perl调用未定义函数的示例

#!/usr/bin/perl 
use strict; 
use warnings; 
  
print "Geeks For Geeks\n"; 
  
report_protein_function("one", "two"); 
  
print "A computer portal for every geek\n";

输出:

output 1

如您所见,程序中发生了错误。现在我们将在程序中使用自动加载方法

#!/usr/bin/perl 
use strict; 
use warnings; 
use vars '$AUTOLOAD'; 
  
print "Geeks For Geeks\n"; 
  
report_protein_function("one", "two"); 
  
print "A computer portal for every geek\n"; 
  
# AUTOLOAD() Function 
sub AUTOLOAD  
{ 
    print "AUTOLOAD is set to $AUTOLOAD\n"; 
    print "with arguments ", "@_\n"; 
}

输出:
output 2

AUTOLOAD()中的重新分派方法

AUTOLOAD()函数可帮助我们提取未定义包的名称。这使得它可以从引用的标量中获取代理对象的数据地址。
Proxy类将日志,然后将re-dispatches写入目标对象。
NEXT可以实施AUTOLOAD仅处理形式的方法调用的方法get_set_并且对于任何其他方法请求实际上是不可见的。

实现看起来像这样:

sub AUTOLOAD 
{ 
    $AUTOLOAD =~ s/.*:://; 
    if ($AUTOLOAD =~ /^get_\w+$/)  
    { 
        # Handle getting... 
    } 
    elsif ($AUTOLOAD =~ /^set_\w+$/)  
    { 
        # Handle setting... 
    } 
    else 
    { 
        # Decline to handle, 
        # passing the request on to someone else... 
        shift->${\"NEXT::$AUTOLOAD"}(@_); 
    } 
}

在AUTOLOAD()中生成代码

Re-dispatching该方法易于执行,但效率低下。代理上的每个方法调用最终都会在AUTOLOAD()中无法正常分派。
这使以前的自动加载方法以闭包方式绑定了未定义子例程的名称。这使得代码被调用并直接进入结果。
此方法更容易清理,并且可以处理AUTOLOAD()

AUTOLOAD()的缺点

这里列出了autoload()的一些缺点

  1. 尽管此方法很有用,但由于无法提供有关对象和类函数的正确信息,因此很难正确使用它。
  2. 它延迟了子例程的加载。
  3. 自动加载执行速度非常负载


相关用法


注:本文由纯净天空筛选整理自pranavduggal221999大神的英文原创作品 Perl | AUTOLOAD Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。