2011-10-21 3 views
3

私は2つの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 }) 
    

    この第2の方法は、より柔軟性があり、かなり頻繁に使用されます。

+0

ご返信ありがとうございました。 –

関連する問題