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";
输出
你可以看到程序中出现了一个错误。现在我们将在程序中使用自动加载的方法
#!/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";
}
输出:
在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()的缺点
- 尽管这个方法很有用,但很难正确使用,因为它没有提供关于对象和类的能力的正确信息。
- 它延迟了子程序的加载。
- 自动加载的执行速度非常快