2011-10-21 51 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

感谢您的详细回复。 –