📜  珀尔 |自动加载函数

📅  最后修改于: 2022-05-13 01:54:40.802000             🧑  作者: Mango

珀尔 |自动加载函数

在 Perl 中,Autoload 是定义在包中的例程或机制。使用简单。只要在包中调用了未定义的例程,就会应用它。
如果没有自动加载,未定义的例程将在程序运行时产生错误。为了定位一个或多个包,使用未定义子例程的参数调用 Autoload 子例程。

语法:要使用自动加载,只需将此语法放入您的 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";

输出:

输出 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";
}

输出:
输出 2

AUTOLOAD() 中的重新调度方法

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

实现如下所示:

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() 中生成代码

重新分派方法很容易,但效率低下。代理上的每个方法调用最终都会在AUTOLOAD()中的正常调度中失败。
这使得之前的 autoload 方法与闭包绑定了未定义的子例程的名称。这使得代码被调用并直接转到结果。
此方法更容易清洁并处理AUTOLOAD()中的行为。

AUTOLOAD() 的缺点

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

  1. 尽管此方法很有用,但很难正确使用它,因为它没有提供有关对象和类功能的正确信息。
  2. 它延迟子程序的加载。
  3. Autoload 执行速度很负载