Perl 自动加载(AUTOLOAD)功能

Perl 自动加载(AUTOLOAD)功能

在Perl中,自动加载是一个例行程序或机制,它被定义在一个包中。它使用起来很简单。

如果没有Autoload,未定义的例程将在程序运行时产生错误。要找到一个或多个包,需要调用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";

输出

Perl 自动加载功能

你可以看到程序中出现了一个错误。现在我们将在程序中使用自动加载的方法

#!/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 toAUTOLOAD\n";
    print "with arguments ", "@_\n";
}

输出:

Perl 自动加载功能

在AUTOLOAD()中重新分配方法

AUTOLOAD() 函数帮助我们提取未定义包的名称。这使得它可以从标量引用的代理对象中获得数据地址。

代理类写下日志,然后重新分配给目标对象。

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

重新调度方法很容易做到,但效率很低。在 AUTOLOAD() 中,代理上的每个方法调用最终都会在正常调度中失败 。
这使得之前的自动加载方法关闭绑定未定义子程序的名称。这使得代码的调用和直接进入结果。
这个方法更容易清洁,并处理 AUTOLOAD() 中的行为。

AUTOLOAD()的弊端

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

  1. 尽管这个方法很有用,但很难正确使用,因为它没有提供关于对象和类的能力的正确信息。
  2. 它延迟了子程序的加载。
  3. 自动加载的执行速度非常快

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程