珀尔 |自动加载函数
在 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";
输出:
如您所见,程序中发生了错误。现在我们将在程序中使用自动加载方法
#!/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";
}
输出:
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() 的一些缺点
- 尽管此方法很有用,但很难正确使用它,因为它没有提供有关对象和类功能的正确信息。
- 它延迟子程序的加载。
- Autoload 执行速度很负载