當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Perl AUTOLOAD用法及代碼示例


在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";

輸出:

output 1

如您所見,程序中發生了錯誤。現在我們將在程序中使用自動加載方法

#!/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"; 
}

輸出:
output 2

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()的一些缺點

  1. 盡管此方法很有用,但由於無法提供有關對象和類函數的正確信息,因此很難正確使用它。
  2. 它延遲了子例程的加載。
  3. 自動加載執行速度非常負載


相關用法


注:本文由純淨天空篩選整理自pranavduggal221999大神的英文原創作品 Perl | AUTOLOAD Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。