在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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。