在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";
输出:
如您所见,程序中发生了错误。现在我们将在程序中使用自动加载方法
#!/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类将日志,然后将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()的一些缺点
- 尽管此方法很有用,但由于无法提供有关对象和类函数的正确信息,因此很难正确使用它。
- 它延迟了子例程的加载。
- 自动加载执行速度非常负载
相关用法
- Perl each()用法及代码示例
- Perl oct()用法及代码示例
- Perl log()用法及代码示例
- Perl abs()用法及代码示例
- Perl cos()用法及代码示例
- Perl uc()用法及代码示例
- Perl chr()用法及代码示例
- Perl exp用法及代码示例
- Perl sin()用法及代码示例
- Perl hex用法及代码示例
- Perl tell()用法及代码示例
- Perl int()用法及代码示例
- Perl ord()用法及代码示例
- Perl rename()用法及代码示例
注:本文由纯净天空筛选整理自pranavduggal221999大神的英文原创作品 Perl | AUTOLOAD Function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。