2011-10-21 74 views
3

我正在使用可以比較兩個XML文檔的Perl mod XML :: SemanticDiff。我想寫我自己的自定義處理程序,但是,對於Perl來說相對較新,我不知道如何執行此操作。Perl Handler有很好的介紹嗎?

我明白,處理程序只不過是在某些事件發生時被調用的子程序。但是我對這些事件如何調用我的代碼中的方法的實現細節很模糊。

例如,基本實現該模塊的喜歡的東西開始:

my $diff = XML::SemanticDiff->new(keepdata=> 1, keeplinenums => 1, diffhandler => 1); 
my @changes = $diff->compare($file1, $file2); 

我知道,我的自定義處理程序會是這個樣子:

sub element_value($self, $element, $to_element_properties, $fromdoc_element_properties) { 
    my ($self, @args) = @_; 

} 

但確實有需要是干預代碼實際調用這個子?喜歡的東西,

foreach my $change (@changes) { 
    $change->element_value(some_arguements_here); 
} 

或者是在執行$diff->compare($file1, $file2);處理程序自動的叫什麼?

任何指針將不勝感激。

回答

2

是的,它們是由發動機「自動」調用的。

如果你看一下源代碼(從庫的CPAN頁XML::SemanticDiff鏈接),你可以看到它很容易做到:

sub compare { 
    # ... some code 

     # element value test 
     unless ($from_doc->{$element}->{TextChecksum} 
      eq $to_doc->{$element}->{TextChecksum}) { 
      push (@warnings, $handler->element_value($element, 
                $to_doc->{$element}, 
                $from_doc->{$element})) 
         if $handler->can('element_value'); 
     } 

有三種處理子程序(取決於如何使用它們的庫被設計爲:

  1. 預定義的名稱。這意味着,該庫被設計爲在特定情況下通過調用名爲「XYZ()」的固定名稱的子。從「哪個名稱空間搜索具有該名稱的子文件」方面來說,這非常困難。爲了解決這個問題,更常用的方法是#2:

  2. 具有預定義方法名稱的自定義差異處理程序類。正如你可以從XML::SemanticDiff文檔看到的,你的庫就是這種情況。

    該類通常從一些現有的基本處理程序類繼承,它們具有應該由您的自定義子類過度使用的默認處理程序。或者,它只需要實現一些/所有預定義的方法,但不必繼承(後者就是這種情況)。

    在XML的情況下:: SemanticDiff的,你告訴你的模塊自定義處理程序是給它的自定義處理程序類的一個對象是什麼:

    use XML::SemanticDiff; 
    use MyCustomHandlerModule; 
    my $handlerObj = MyCustomHandlerModule->new(); 
    my $diff = XML::SemanticDiff->new({ diffhandler => $handlerObj }); 
    
  3. 註冊的處理程序。大多數情況下,登記經由傳遞一個子程序參考處理:

    sub myHandler1 { ... }; 
    sub myHandler2 { ... }; 
    my $obj = My::Library->new({ Event1_handler => &myHandler1 
              , Event2_handler => &myHandler2 }) 
    

    該第二方法是更靈活並且更顯著頻繁使用。

+0

感謝您的詳細回覆。 –