2011-10-21 4 views
3

두 개의 XML 문서를 비교할 수있는 Perl mod XML :: SemanticDiff를 사용하고 있습니다. 나 자신의 커스텀 핸들러를 작성하고 싶지만 Perl에 비교적 익숙하지 않은 나는 이것을 어떻게 수행 해야할지에 관해서 분노하고있다.Perl 처리기에 대한 좋은 소개가 있습니까?

핸들러는 특정 이벤트가 발생할 때 호출되는 서브 루틴에 지나지 않습니다. 그러나 이러한 이벤트가 내 코드에서 메서드를 호출하는 방법에 대한 구현 세부 정보는 모호합니다. 예를 들어

는이 모듈의 기본 구현이 같은 시작 :

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'); 
     } 

핸들러 서브 루틴의 3 종류가 있습니다 (방법에 따라 라이브러리를 사용하는 라이브러리가 설계되었습니다.) :

  1. 미리 정의 된 이름입니다. 즉, 라이브러리는 항상 특정 시나리오에서 "XYZ()"라는 고정 된 이름으로 하위를 호출하도록 설계되었습니다. "네임 스페이스가 그 이름을 가진 서브를 검색 할 것"이라는 측면에서 보면 매우 까다 롭습니다. 이 문제를 해결하기 위해 더 일반적인 방법은 # 2입니다.

  2. 사전 정의 된 메서드 이름을 사용하는 사용자 지정 diff 처리기 클래스입니다. 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

답장을 보내 주셔서 감사합니다. –